Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ошибка: Control has no parent window


Автор: pushok 28.7.2010, 21:22
Здравствуйте.

Появилась такая ошибка: 'Control has no parent window' (строка № 28 в приведенном ниже коде)

Искал по интернету: в основном советуют переопределить метод какой-то, которые у меня в принципе не используются и процедура то вроде простенькая

Код

procedure MySave(FileName:string); // FileName содержит полный путь к файлу (с директорией)
var
files:TStrings;
d1,d2:string;
flb:TFileListBox;
begin
// Узнаем путь где лежит данная программа
d1:=application.ExeName;
while ((length(d1)>1) and (d1[length(d1)]<>'\')) do
delete(d1,length(d1),1);
// Создаем временную директорию для помещения туда файлов
d2:=d1+'mytmp';
CreateDir(d2);
// Перемещаем туда файлы из компонент
// ...
Form1.Memo2.Lines.Clear; // В Memo2 будет располагаться информация о файлах, которые содержать в папке
//
Form1.Memo2.Lines.Add('1'); // Первый раздел - текстовые файлы (кол-во, имена файлов)
Form1.Memo1.Lines.SaveToFile(d2+'\text1.txt');
Form1.Memo2.Lines.Add('text1.txt'); //
Form1.Memo2.Lines.Add('1'); // Второй раздел - файлы изображений (кол-во, имена файлов)
Form1.Image1.Picture.SaveToFile(d2+'\img1.bmp'); //
Form1.Memo2.Lines.Add('img1.bmp'); //
Form1.Memo2.Lines.SaveToFile(d2+'\main.ini');
//
flb:=TFileListBox.Create(form1); // Создаем бокс для получения списка файлов в папке
flb.Directory:=d2;  // Задаем боксу путь к папке
files:=TStrings.Create; // Создаем переменную под список имен файлов в папке
files:=flb.Items; // Копируем список имен файлов из бокса в переменную
CompressFiles(files,FileName); // Архивируем в один файл
DelDir(d2); // Удаляем временную папку со всем содержимым
end;


По комментариям должно быть ясно что там происходит.
Постараюсь пресечь сразу три ветви "советов":
1. Это проба, т.е. я только пробую как возможно сделать, то что я хочу, поэтому взял только один Image и один Memo
2. Знаю, что можно поместить содержимое компонент в потоки, объединить их и после архивировать в один файл - пока пробую такой вариант.
3. Пробовал обойтись без files:TStrings - выдает ту же ошибку при попытке архивировать

Остальные советы и замечания буду рад слышать.

Заранее благодарю за помощь.

Автор: Данкинг 28.7.2010, 21:45
Код

files:TStringList

? smile 

Автор: Delvish 28.7.2010, 21:58
1. Данкинг указал на ошибку, которую тебе выкидывает программа. тут бы тему и закрыть, но...
2. несовсем понятен кусочек кода
Код

d1:=application.ExeName;
while ((length(d1)>1) and (d1[length(d1)]<>'\')) do
delete(d1,length(d1),1);


т.е. если путь "c:\proga.exe", то при первом шаге d1 станет равен "c:\proga.ex", при втором "c:\proga.e" и т.д., но что это даст? на 3-м шаге ошибку?

Автор: ~FoX~ 28.7.2010, 22:03
Цитата(pushok @  28.7.2010,  22:22 Найти цитируемый пост)
// Узнаем путь где лежит данная программа
d1:=application.ExeName;


Код

ExtractFilePath(Application.ExeName); //Вурент путь вместе с '\'


Добавлено через 3 минуты и 11 секунд
Цитата(pushok @  28.7.2010,  22:22 Найти цитируемый пост)
3. Пробовал обойтись без files:TStrings - выдает ту же ошибку при попытке архивировать

TStrings - абстрактный/базовый класс, не рекомендуеца его использовать для таких работе, есть наслдники более подходящие - TStringList

Автор: pushok 28.7.2010, 22:27
= ))

Спасибо, за советы. Буду пробовать, думаю вы не ошибаетесь, поэтому тему можно закрывать = )

Автор: Данкинг 28.7.2010, 22:54
Цитата(pushok @  28.7.2010,  23:27 Найти цитируемый пост)
поэтому тему можно закрывать = ) 

Закрывай. Сверху справа. smile 

Автор: bems 28.7.2010, 23:25
pushok, про TStrings тебе правильно сказали, но это же EAbstractError а не Control has no parent window

Предполагаю ошибку строкой раньше. Сделай сразу после создания flb
Код

flb.Parent := form1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)