Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Вниз

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;


 
Elen ©   (2007-02-05 16:21) [41]


> RASkov
  Alarm[i] := True else Alarm[i] := False;

Ты хочеш сказать что нужно   Alarm[i-1] := True else Alarm[i-1] := False; т.к. он с нуля начинается? тогда в [28] автор опять мозги пудрит


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


> RASkov

А извини я [29] пропустила :)


 
uncle benc   (2007-02-05 16:24) [43]

Поле Id - счетчик. (т.е. LongInt)


 
RASkov   (2007-02-05 16:32) [44]

И вот еще
if Query.RecordCount >= 1 then
   Grid.RowCount := Query.RecordCount+1
   else Grid.RowCount := 2;
   ClearGrid(Grid);
По ходу надо +2 делать...

Т.е. мы должны добавить столько строк, сколько записей в таблице+1
А значения RowCount начинаются с 0, RecordCount с 1
Ну и здесь ошибка
Grid.Cells[0, i] := Query.FieldByName("Id").AsString;
Нет последней строчки в гриде....


 
RASkov   (2007-02-05 16:33) [45]

> Т.е. мы должны добавить столько строк, сколько записей в
> таблице+1

Т.е. мы должны добавить столько строк, сколько записей в таблице+1 на заголовки


 
uncle benc   (2007-02-05 16:43) [46]


> RASkov   (05.02.07 16:32) [44]

Тут нет ошибки.

> значения RowCount начинаются с 0, RecordCount с 1


Исходя из этого RowCount := RecordCount+1
т.е. если возвращенных записей 1, то RowCount станет равным 2 (заголовок и строка)


 
uncle benc   (2007-02-05 16:46) [47]

Хотя, ладно, всем спасибо. Думаю нет смысла дальше развивать эту тему, т.к. переливаем из пустого в порожнее.


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

> uncle benc   (05.02.07 15:43) [25]
>    Grid.RowCount := Query.RecordCount+1


Садитесь. Два.


 
Anatoly Podgoretsky ©   (2007-02-05 20:31) [49]

> uncle benc  (05.02.2007 16:43:46)  [46]

В школе на математику принципиально не ходил.


 
Германн ©   (2007-02-06 02:03) [50]


> Anatoly Podgoretsky ©   (05.02.07 20:31) [49]
>
> > uncle benc  (05.02.2007 16:43:46)  [46]
>
> В школе на математику принципиально не ходил.
>

Ранее была "слепая печать". Её преодолели. Так теперь ещё возникло "слепое" чтение! :-)



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

Форум: "Начинающим";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.045 c
8-1148858988
452
2006-05-29 03:29
2007.02.25
Создание видео файлов (avi,vob,wmv,mpeg4)


2-1170431934
nordic3
2007-02-02 18:58
2007.02.25
Активирование окна


4-1160766541
gellmar
2006-10-13 23:09
2007.02.25
Как реализовать парсинг PE64 файлов под win32 на делфи?


15-1170156228
Calibr
2007-01-30 14:23
2007.02.25
Вопрос по HTML?


15-1170418278
DVM
2007-02-02 15:11
2007.02.25
Самый быстрый алгоритм шифрования.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский