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


Автор: Darkmaster 10.2.2006, 20:36
такая вот проблема, мне нужно чтобы прога при старте(либо OnShow -Form либо OnCreate) загружала в Мемо определенный текстовый файл. Когда просто запускаешь прогу то все работает, но вот в чем проблема, у меня прога добавлена в автозагрузку и при автозагрузке текстовый файл не грузится. Как исправить? Вот код:
Код

procedure TForm1.FormShow(Sender: TObject);
begin
if FileExists('воскресенье.txt') then
Memo7.Lines.LoadFromFile(ExtractFilePath(ParamStr(0))+'воскресенье.txt');
if FileExists('суббота.txt') then
Memo6.Lines.LoadFromFile('суббота.txt');
if FileExists('пятница.txt') then
Memo5.Lines.LoadFromFile('пятница.txt');
if FileExists('четверг.txt') then
Memo4.Lines.LoadFromFile('четверг.txt');
if FileExists('среда.txt') then
Memo3.Lines.LoadFromFile('среда.txt');
if FileExists('вторник.txt') then
Memo2.Lines.LoadFromFile('вторник.txt');
if FileExists('понедельник.txt') then
Memo1.Lines.LoadFromFile('понедельник.txt');

Автор: _hunter 10.2.2006, 20:47
путь к файлу толком пропиши ( впиши абсолютный )

Автор: Darkmaster 10.2.2006, 22:05
проблема в том что это не устраивает, так как программа может хранится в разных каталогах и файлы должны находится в папке с прогой.

Автор: nickelfire 10.2.2006, 22:17
Ты напиши так:
Код

memo1.lines.loadfromfile(getfilepath(paramstr(0))+'filename.txt');

тока не помню точно paramstr(0) или paramstr[0].

Автор: Foley 10.2.2006, 23:17
Можешь попробовать так (если файл воскресенье в каталоге проги):

memo1.lines.loadfromfile(GetCurrentDir+'воскресенье.тхт')

Автор: Snowy 10.2.2006, 23:54
Код
SetCurrentDirectory(PChar(ExtractFileDir(ParamStr(0))));
Вылечит твою проблему.

Автор: Int64 11.2.2006, 11:46
Цитата(Foley @ 10.2.2006, 23:17)
Можешь попробовать так (если файл воскресенье в каталоге проги):

memo1.lines.loadfromfile(GetCurrentDir+'воскресенье.тхт')

GetCurrentDir - возвращает текущую директорию. Текущая директория не обязательно равна директории программы. Можно использовать SetCurrentDirectory, как показал Snowy. Но использовать абсолютные пути будет правильней. Не пойму, почему ты в LoadFromFile используешь абсолютный путь, а в FileExists - нет. Если текущая директория не равна директории твоей программы, то LoadFromFile никогда не выплнится:
Код

if FileExists('воскресенье.txt') then
Memo7.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'воскресенье.txt');

Напиши так:
Код

if FileExists(ExtractFilePath(ParamStr(0)) + 'воскресенье.txt') then    
Memo7.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'воскресенье.txt');

И все будет работать smile.

Автор: Yanis 11.2.2006, 12:09
Код

const
  def_ext = '.txt';
  days_list: array[0..6] of string = ('Понедельник', 'Вторник', 'Среда', 'Четверг' ,'Пятница' ,'Суббота', 'Воскресенье');
...
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  s := GetCurrentDir;
  SetCurrentDir(ExtractFilePath(ParamStr(0)));
  for i := 0 to High(days_list) do
    if FileExists(days_list[i]+def_ext) then
      if FindComponent('Memo'+IntToStr(i+1)) is TMemo then
        (FindComponent('Memo'+IntToStr(i+1)) as TMemo).Lines.LoadFromFile(days_list[i]+def_ext);
  SetCurrentDir(s);
end;

Автор: Int64 11.2.2006, 12:58
Цитата(Yanis @ 11.2.2006, 12:09)
Код

const
  def_ext = '.txt';
  days_list: array[0..6] of string = ('Понедельник', 'Вторник', 'Среда', 'Четверг' ,'Пятница' ,'Суббота', 'Воскресенье');
...
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  s := GetCurrentDir;
  SetCurrentDir(ExtractFilePath(ParamStr(0)));
  for i := 0 to High(days_list) do
    if FileExists(days_list[i]+def_ext) then
      if FindComponent('Memo'+IntToStr(i+1)) is TMemo then
        (FindComponent('Memo'+IntToStr(i+1)) as TMemo).Lines.LoadFromFile(days_list[i]+def_ext);
  SetCurrentDir(s);
end;

Я лично не вижу смысла использовать SetCurrentDir даже так - лишние строки кода, нет где гарантии того, что директорию никто не сменит во время работы - в результате опять файл не грузиться. Пихать в цикл - не рационально, не красиво... Указав абсолютный путь избавляемся от подобного рода проблем. Ну и еще - дело вкуса, а точнее - привычки.

Автор: Yanis 11.2.2006, 13:23
Int64, я не сомневаюсь в вашей способности написать более функциональный и быстрый код, потому что надеюсь вы не сомневаетесь в моей способности сделать тоже самое.
В тот момент мне это решение пришлось по вкусу и я так написал. Учитывая саму проблему автора и выбранный путь её решения такой код будет смотреться вполне прилично smile

Автор: Int64 11.2.2006, 13:42
Просто пытался направить человека на путь истинный smile

Автор: Foley 12.2.2006, 00:24
Цитата(Int64 @ 11.2.2006, 11:46 Найти цитируемый пост)
GetCurrentDir - возвращает текущую директорию. Текущая директория не обязательно равна директории программы

а тогда по какому принцыпу определяется текушая директория? у меня всегда работает, ниразу не глючило. значит если я войду в другую директорию в моем компе то прога не найдет этого файла?


Цитата(_hunter @ 10.2.2006, 20:47 Найти цитируемый пост)
путь к файлу толком пропиши ( впиши абсолютный )

можно ведь и путь к экзешнику найти программно и добавить его в эдит, потом при указании пути подставить значение эдита + имя файла, в этом случае прога будет корректно работать и при копировании в другой каталог.
Добавлено @ 00:33
упс... недоглядел... что-то совсем невнимательный стал пардон за:
Цитата(Foley @ 12.2.2006, 00:24 Найти цитируемый пост)
можно ведь и путь к экзешнику найти программно и добавить его в эдит, потом при указании пути подставить значение эдита + имя файла, в этом случае прога будет корректно работать и при копировании в другой каталог

(это у всех написано)

Автор: Yanis 12.2.2006, 05:05
Цитата(Foley @ 12.2.2006, 00:24 Найти цитируемый пост)
а тогда по какому принцыпу определяется текушая директория?

Напрмер, в свойствах ярлыка к любой программе есть свойство "Рабочая папка". Если значение этого свойства не совпадает с путём к программе, то текущая дирректория при запуске через этот ярлык будет уже "неверной" для программы.

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