![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Invalid pointer operation [D7, XP]
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), но не уничтожает ее.