Форум: "Основная";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
ВнизСоздание StringGrid в runtime Найти похожие ветки
← →
calmterror (2004-01-12 17:21) [0]Люди, помогите с созданием StringGrid в runtime.
Все хорошо, пока не выставлю ему в Options опцию goEditing и не изменю что-то в нем. После этого Access violation при закрытии, чтоб я не делал.
Может кто-нибудь с этим сталкивался, помогите, в чем причина?
← →
alex_*** (2004-01-12 17:23) [1]как здесь принято отвечать, ошибка в строке 17 :))
как создаешь? и что изменишь?
← →
Goida (2004-01-12 17:44) [2]А ты создаешь потом строки, в которые ты собираешься писать?
← →
calmterror (2004-01-12 18:45) [3]Вот код. Казалось, что можеть быть проще?
var SG:TStringGrid;
procedure FormShow;
begin
SG:=TString.Create(Form);
SG.Parent:=Form;
SG.Options:=SG.Options-[goRangeSelect]+[goEditing];
end;
procedure FormClose;
begin
SG.Free;
end;
To Goida: Так вроде ж не надо? Кроме того с выключенным редактированием и присваиванием значений ячейкам из программы все работает как часы.
← →
Плохиш_ (2004-01-12 19:12) [4]>calmterror © (12.01.04 18:45) [3]
1. не Form, а self
2. Кто-такой TString?
← →
calmterror (2004-01-12 19:25) [5]1. Вопрос не принципиальный, но даже если так ничего не меняется.
2. Описался конечно, не TString, а TStringGrid
← →
Юрий Зотов (2004-01-12 20:24) [6]1. Перенесите создание из OnShow в OnCreate.
2. Поставьте в конструкторе не Form, а Self.
3. Уничтожение уберите совсем. Просто выкиньте.
Если после этого ошибка не исчезнет, то либо она где-то в другом месте, либо я - папа римский.
← →
calmterror (2004-01-12 20:46) [7]Первое и второе в общем-то абсолютно ничего не решают, а вот третье как ни странно помогло =8(
Но вот хорошо ли это? Табличка можеть быть весьма не слабая и не одна.
← →
YuRock (2004-01-12 20:56) [8]Вот код деструктора StringList"a:
destructor TStringGrid.Destroy;
function FreeItem(TheIndex: Integer; TheItem: Pointer): Integer; far;
begin
TObject(TheItem).Free;
Result := 0;
end;
begin
if FRows <> nil then
begin
TSparseList(FRows).ForAll(@FreeItem);
TSparseList(FRows).Free;
end;
if FCols <> nil then
begin
TSparseList(FCols).ForAll(@FreeItem);
TSparseList(FCols).Free;
end;
if FData <> nil then
begin
TSparseList(FData).ForAll(@FreeItem);
TSparseList(FData).Free;
end;
inherited Destroy;
end;
Посмотрев на него, можно предположить, что скорее всего неправильно добавляются строки и/или колонки
← →
Stilgar (2004-01-12 21:02) [9]Если не верите что хорошо, сделайте так:
SG:=TString.Create(nil);
(с последующим ручным удалением).
Или так:
procedure FormClose;
begin
FreeAndNil(SG);
end;
← →
calmterror (2004-01-12 21:04) [10]Вот тестовая программа. Я ничего не добавляю, ничего не удаляю. Попробуйте скомпильте, Acceess Violation на выходе+сообщение Control "" has no parent window.
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
end;
var
Form1: TForm1;
S:TStringGrid;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
S:=TStringGrid.Create(Self);
S.Parent:=Form1;
S.Options:=S.Options-[goRangeSelect]+[goEditing];
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
S.Free;
end;
end.
← →
calmterror (2004-01-12 21:08) [11]Добавление - надо только что-то изменить в TStringGrid для нужного результата :)
С FreeAndNil - то же самое
← →
YuRock (2004-01-12 21:10) [12]Попробуйте не писать S.Parent := Form1 - ведь это же и есть Self, который передается в Create. Может из-за этого что-то не то...
← →
calmterror (2004-01-12 21:21) [13]Да Parentом по барабану совершенно что писать. Хоть Form, хоть какой компонент. Результат один и тот же.
← →
Stilgar (2004-01-12 21:24) [14]Хе...
Ошибку не выдает, хотя по моим предположениям должен был. Приведите остальной код.
← →
Юрий Зотов (2004-01-12 22:00) [15]Народ, о чем речь идет? Разве еще не все ясно?
> calmterror © (12.01.04 20:46) [7]
> Первое и второе в общем-то абсолютно ничего не решают
Очень даже решают. Во-первых, OnShow может выполняться хоть сто раз (при каждом Hide/Show) - и каждый раз Вы будете создавать таблицу? Во вторых, что такое у Вас означает Form - это неизвестно, а вот что такое Self - известно точно.
> а вот третье как ни странно помогло
А что тут странного? При уничтожении в OnClose так и должно быть. Вот если бы Вы написали уничтожение в OnDestroy, то все было бы нормально. Но в данном случае и этого не требуется - при указании в конструкторе Self все будет уничтожено правильно, вовремя и без Вашего участия.
> Но вот хорошо ли это? Табличка можеть быть весьма не слабая и
> не одна.
Открываем книжку или справку. Читаем про список Components и про то, что означает AOwner в конструкторе компонента и Self в обработчиках событий. А еще про то, что происходит при уничтожении любого компонента и про то, что форма - это тоже компонент.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c