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

Вниз

Создание 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
14-72921
Golon
2003-12-31 19:54
2004.01.23
Убить Билла


14-72881
TButton
2004-01-05 00:56
2004.01.23
блин! в кладовке вообще поиск есть?


3-72680
Ткаченко Сергей
2003-12-24 15:46
2004.01.23
Ошибка при генерации отчета???!!!


7-72959
qwe
2003-11-06 10:32
2004.01.23
Как можно получить информацию о жестком диске


1-72806
uu
2004-01-12 19:56
2004.01.23
currency