Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Invalid pointer operation [D7, XP]


Страницы:   1 2 3

uncle benc ©   (2007-02-05 12:32:00) 

Господа, помогите разобраться.
Есть процедура вида:
procedure ClearGrid(var Grid : TGrid);
var i : Integer;
begin
for i:=1 to Grid.RowCount-1 do
  Grid.Rows[i].Clear;
end;


Периодически (не каждый раз), при работе данной процедуры вылетает ошибка указанная в заголовке вопроса.
С чем это может быть связано?


RASkov   (2007-02-05 15:56:00) [21]

> [28] uncle benc   (05.02.07 15:50)


> Убрал var

А оно осталось :) По умолчанию для классов так и есть как ты сделал.... Т.е. классы передаються по ссылке


RASkov   (2007-02-05 15:52:00) [22]

> SetLength(Alarm,Query.RecordCount);

SetLength(Alarm,Query.RecordCount+1);
или
if Query.FieldByName('Alarm').AsBoolean then
  Alarm[ i-1] := True else Alarm[i -1] := False;

ИМХО....


uncle benc   (2007-02-05 15:50:00) [23]

Убрал var
Убрал вызов ClearGrid
Теперь ошибка вылезает тут:

> Grid.Cells[0,i] := Query.FieldByName('Id').AsString;


Kolan   (2007-02-05 15:48:00) [24]

Grid.Cells[0,i] := Query.FieldByName('Id').AsString;
А что DBGrid неподошел?


Kolan   (2007-02-05 15:47:00) [25]

> Grid.Cells[0,i] := Query.FieldByName('Id').AsString;

А что DBGrid нельзя использовать?


uncle benc   (2007-02-05 15:43:00) [26]

Вот код:

procedure TDM.FillGrid(FromDate,ToDate : Double; SortBy : String; var Grid : TStringGrid);
var i : Integer;
begin
 Query.Active := False;
 Query.SQL.Clear;
 Query.SQL.Append('SELECT * FROM Zayava WHERE ((((Zayava.DateIn)>='+
   FloatToStr(FromDate)+') AND ((Zayava.DateOut)<='+
   FloatToStr(ToDate)+')) OR Ispolnitel = 0) ORDER BY '+ SortBy+';');
 Query.Active := True;
 if Query.RecordCount >= 1 then
    Grid.RowCount := Query.RecordCount+1
    else Grid.RowCount := 2;
    ClearGrid(Grid);
 Query.First;
 i:=1;
 SetLength(Alarm,Query.RecordCount);
 While not Query.Eof do
   begin
     Grid.Cells[0,i] := Query.FieldByName('Id').AsString;
     Grid.Cells[1,i] := DateTimeToStr(Query.FieldByName('DateIn').AsFloat);
     Grid.Cells[2,i] := Query.FieldByName('Avtor').AsString;
     Grid.Cells[3,i] := Query.FieldByName('Zayava').AsString;
     if Query.FieldByName('DateOut').AsFloat <> 0 then
       Grid.Cells[4,i] := DateTimeToStr(Query.FieldByName('DateOut').AsFloat);
     Grid.Cells[5,i] := Query.FieldByName('Ispolnitel').AsString;
     if Query.FieldByName('Alarm').AsBoolean then
        Alarm[i] := True else Alarm[i] := False;
     Query.Next;
     i:=i+1;
   end;
 Query.Active := False;
 for i := 1 to Grid.RowCount-1 do
   begin
     if Grid.Cells[2,i] <> '' then
       begin
         Grid.Cells[2,i] :=  GetAssignedValue('Personal','Name','Id='+Grid.Cells[2,i]);
         if Grid.Cells[5,i] <> '' then
           Grid.Cells[5,i] :=  GetAssignedValue('Personal','Name','Id='+Grid.Cells[5,i]);
         if Grid.Cells[5,i] = 'NoRecordsFound' then
           Grid.Cells[5,i] := '';
       end;
   end;
 if SortBy = 'Avtor' then SortGrid(2,Grid);
 if SortBy = 'Ispolnitel' then SortGrid(5,Grid);
end;


Elen   (2007-02-05 15:26:00) [27]


> а зачем var ?

А что он может ошибку дать?


Elen   (2007-02-05 15:23:00) [28]


> эта процедура вызывается в данном случае в теле процедуры
> FillGrid.

Тогда только код в студию. И еще пройдись дебаггером еще раз тщательней. И посмотри чему переменки равны, которые взаимодействуют с операторами, выдающими ошибки.


Игорь Шевченко   (2007-02-05 15:22:00) [29]


> procedure FillGrid(var Grid : TStringGrid);


а зачем var ? Убери


uncle benc   (2007-02-05 15:19:00) [30]

Не знаю, кто кого водит за нос, может и моя ось меня :)
Для полноты картины:
Есть некий MyGrid : TStringGrid и форма MyForm.dfm
который находится в некоем модуле MyUnit.pas
Есть отдельный модуль GlobalUnit.pas где хранятся глобальные переменные
и собраны наиболее часто используемые процедуры.
При некоем событии, когда необходимо обновить информацию на гриде вызывается процедура из модуля GlobalUnit.pas
procedure FillGrid(var Grid : TStringGrid);
вызываем так FillGrid(MyGrid);

есть еще процедура ClearGrid(var Grid : TStringGrid);
эта процедура вызывается в данном случае в теле процедуры FillGrid.
вызываем так ClearGrid(Grid);

Ну вот вроде и все. Ошибка может раз 20 не вылетать а на 21 вылететь.


Игорь Шевченко   (2007-02-05 15:05:00) [31]

Работает:

unit Unit1;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, StdCtrls;

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   procedure ClearGrid (Grid: TStringGrid);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 I, J: Integer;
begin
 with StringGrid1 do begin
   RowCount := 5;
   ColCount := 4;
   for I := 1 to RowCount - 1 do
     for J := 1 to ColCount - 1 do
       Cells[J, I] := Format('%d,%d', [I, J]);
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ClearGrid (StringGrid1);
end;

procedure TForm1.ClearGrid(Grid: TStringGrid);
var
 I, J: Integer;
begin
 for I := 1 to Grid.RowCount - 1 do
   Grid.Rows[I].Clear;
end;

end.


RASkov   (2007-02-05 15:05:00) [32]

А лучше так:

procedure ClearGrid(Grid : TGrid);
var i : Integer;
begin
if not Assigned(Grid) then Exit;
for i:=Grid.RowCount-1 downto 1 do
Grid.Rows[i].Clear;
end;


Elen   (2007-02-05 15:03:00) [33]


> Johnmen

Полностью согласна, но учитывая [3] автор водит нас занос или автора водит занос его ось :)


Johnmen   (2007-02-05 15:03:00) [34]


> uncle benc

Ты что-то не договариваешь. А вот что, непонятно....


RASkov   (2007-02-05 15:03:00) [35]

> [0] uncle benc   (05.02.07 12:32)

Попробуй изменить это
procedure ClearGrid(var Grid : TGrid);
var i : Integer;
begin
for i:=1 to Grid.RowCount-1 do
 Grid.Rows[i].Clear;
end;

на это:
procedure ClearGrid(var Grid : TGrid);
var i : Integer;
begin
for i:= Grid.RowCount-1 downto 1do
 Grid.Rows[i].Clear;
end;


Elen   (2007-02-05 15:01:00) [36]


> uncle benc

Незнаю чего у тебя за ошибка у меня вот это:
procedure TForm1.BitBtn1Click(Sender: TObject);
var i : Integer;
begin
for i:=1 to StringGrid1.RowCount-1 do
 StringGrid1.Rows[i].Clear;
end;


Работает на ура. Проверь как вызываеш эту свою проц и что в нее передается.


Johnmen   (2007-02-05 15:00:00) [37]


> Elen ©   (05.02.07 14:52) [11]


Во-первых, вы уверены, что мы говорим о TStringGrid, а не о сконструёванном автором неком TGrid, где сей метод может означать совсем другое? Я не уверен.
И во-вторых, исходя из приведённого куска другого сколь-нибудь подходящего объяснения я не вижу. А вы?


uncle benc   (2007-02-05 14:59:00) [38]


> Johnmen ©   (05.02.07 14:39) [8]
> Дык всё ясно. Начинаем делать clear, а это удаление строки
> (в данном случае), потом индекс i превысил текущее максимальное
> значение, ведь ты же удалял строки...:)))


В данном случае я если и удалял, то удалял столбцы в строке. Если я правильно понимаю.
Descendants of TStrings implement a Clear method to delete all the strings in the list, and to remove any references to associated objects.


uncle benc   (2007-02-05 14:56:00) [39]

Раньше делал так:
for i:= 1 to Grid.RowCount-1 do
 for j:=0 to Grid.ColCount-1 do
   Grid.Cells[j,i] := '';

Тоже вылетала ошибка.

Дебагером проверял, бяка вылетала
на Grid.Rows[i].Clear; или, как во втором случае
на Grid.Cells[j,i] := '';
Причем, значения Rows[i] := ('1','2','3') - как и должно быть или
Cells[j,i] := '4' - что тоже верно в данном случае.


Elen   (2007-02-05 14:52:00) [40]


> А что вы хотели сказать?

Причем тут удаление?   Grid.Rows[i].Clearвсего лиш очищает строку ( to empty), но не уничтожает ее.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо