Форум: "Начинающим";
Текущий архив: 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 := 1i:=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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.045 c