Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

Invalid pointer operation   Найти похожие ветки 

 
uncle benc   (2007-02-05 12:32) [0]

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


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


 
Правильный Вася   (2007-02-05 12:40) [1]

зачем var Grid ?
что за класс TGrid ?


 
Ega23 ©   (2007-02-05 12:44) [2]


> for i:=1 to Grid.RowCount-1 do
>   Grid.Rows[i].Clear;


А почему i:=1 to ? Почему не i:=0 to ?


 
uncle benc   (2007-02-05 13:05) [3]


> Правильный Вася   (05.02.07 12:40) [1]


Value parameters are passed by value, while variable parameters are passed by reference.

что за класс TGrid ?    TStringGrid


> Ega23 ©   (05.02.07 12:44) [2]


Потому что заголовок всегда один и тот-же.

Хотя, какое отношение это имеет к вопросу


 
Desdechado ©   (2007-02-05 13:25) [4]

Объектные переменные всегда по ссылке передаются.
А про грид - это опечатка или намеренное искажение типа?


 
uncle benc   (2007-02-05 13:30) [5]

это опечатка.


 
uncle benc   (2007-02-05 14:23) [6]

Может натолкнете на мысль, куда копать?


 
Elen ©   (2007-02-05 14:34) [7]


> Может натолкнете на мысль, куда копать?

Ну попробуй дебугером пройтись и посмотри на какой строчке вылезает бяка и что при этом передается или принимается.


 
Johnmen ©   (2007-02-05 14:39) [8]

Дык всё ясно. Начинаем делать clear, а это удаление строки (в данном случае), потом индекс i превысил текущее максимальное значение, ведь ты же удалял строки...:)))


 
Elen ©   (2007-02-05 14:46) [9]


> Johnmen

procedure Clear; virtual; abstract;
Introduces an abstract method to empty the list and any associated objects.


 
Johnmen ©   (2007-02-05 14:49) [10]


> Elen ©   (05.02.07 14:46) [9]

Спасибо, я знаю о существовании F1.
А что вы хотели сказать? И как это связано с Grid.Rows[i].Clear;?


 
Elen ©   (2007-02-05 14:52) [11]


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

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


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

Раньше делал так:
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" - что тоже верно в данном случае.


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


> 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.


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


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


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


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


> uncle benc

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


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


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

> [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 1 do
 Grid.Rows[i].Clear;
end;


 
Johnmen ©   (2007-02-05 15:03) [17]


> uncle benc

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


 
Elen ©   (2007-02-05 15:03) [18]


> Johnmen

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


 
RASkov   (2007-02-05 15:05) [19]

А лучше так:

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;


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

Работает:

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.


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

Не знаю, кто кого водит за нос, может и моя ось меня :)
Для полноты картины:
Есть некий 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:22) [22]


> procedure FillGrid(var Grid : TStringGrid);


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


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


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

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


 
Elen ©   (2007-02-05 15:26) [24]


> а зачем var ?

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


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

Вот код:

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;


 
Kolan ©   (2007-02-05 15:47) [26]

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

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


 
Kolan ©   (2007-02-05 15:48) [27]

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


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

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

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


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

> SetLength(Alarm,Query.RecordCount);

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

ИМХО....


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

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


> Убрал var

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


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


> Avtor


> Ispolnitel


> Zayava.DateIn


Убивать из рогатки


 
uncle benc   (2007-02-05 15:58) [32]


> Игорь Шевченко ©   (05.02.07 15:57) [31]
>
> > Avtor
>
>
> > Ispolnitel
>
>
> > Zayava.DateIn

Что это меняет?


 
uncle benc   (2007-02-05 16:07) [33]


> Игорь Шевченко ©   (05.02.07 15:57) [31]


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


 
Elen ©   (2007-02-05 16:08) [34]


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

Так проверь чему у тебя равно i


 
Loginov Dmitry ©   (2007-02-05 16:08) [35]

Может на грид обработчики какие повесил?


 
Elen ©   (2007-02-05 16:08) [36]


> то компилятору не понравились названия полей и он нарочно
> вставил генерацию ошибки в программу

Это ты пошутил?


 
uncle benc   (2007-02-05 16:08) [37]

i := 1


 
RASkov   (2007-02-05 16:08) [38]

> [31] Игорь Шевченко ©   (05.02.07 15:57)


> Убивать из рогатки

Я тоже порой наподобии так обзываю идентификаторы, с англ. проблема, а так более менее понятно

ЗЫ пишу в основном только для себя.


 
Elen ©   (2007-02-05 16:09) [39]


> uncle benc

А поле ID у тебя строковое? И что за ошибка дословно?


 
RASkov   (2007-02-05 16:14) [40]

> [37] uncle benc   (05.02.07 16:08)
> i := 1


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;



> А поле ID у тебя строковое?

А какя разница если Grid.Cells[0,i] := Query.FieldByName("Id").AsString;



Страницы: 1 2 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.03 c
15-1170225138
vitv
2007-01-31 09:32
2007.02.25
В чём преимущества MSSQL2000 над IB6X(FB1.5.X)?


2-1170941650
niil
2007-02-08 16:34
2007.02.25
Загрузка картинки в Image из интернета


4-1160561568
AlexT1000
2006-10-11 14:12
2007.02.25
Список установленных программ. Как его получить?


15-1169821854
Ученик чародея
2007-01-26 17:30
2007.02.25
Класс TLamer.


2-1170918311
fd979
2007-02-08 10:05
2007.02.25
Проблема вставки в MS Access