Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
1

OpenDialog и клики ;)

04.09.2009, 22:10. Показов 5319. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! подскажите пожалуйста, я вставил OpenDialog и после выбора файла, его текст заношу в MEMO!
Всё норм, НО! Файлы выбираються при ОДНОМ клике левой клавишей мышки.

Я так понимаю, что я использую не то событие, да?

Каккое событие правильно использовать? Или как сделать, чтобы было так как везде?

Заранее спасибо, уважаемые форумчане

Добавлено через 42 секунды
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.OpenDialog1SelectionChange(Sender: TObject);
begin
 
Memo1.Clear();
Assignfile(ChoisedFile,OpenDialog1.FileName);
Reset(ChoisedFile);
while(not Eof(ChoisedFile)) do
begin
ReadLn(ChoisedFile, FileText);
Memo1.Text := TrimLeft(Memo1.Text+#13#10+FileText);
end;
CloseFile(ChoisedFile);
Form1.Caption := ExtractFileName(OpenDialog1.FileName)+' - Блокнот';
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2009, 22:10
Ответы с готовыми решениями:

OpenDialog or SaveDialog
Никак не разберусь с Open и Save диалогами. В папке, куда установлена программа, имеется файл bdf...

ListBox и OpenDialog
Есть плейлист, в котором сохранены адреса к файлам типа: F:\music\track1.mp3 нужен ОнКлик на...

Некорректная работа OpenDialog в win7
Доброго времени суток всем, уважаемые форумчане! Столкнулся с такой проблемой: При открытии...

Как добавить прослушку в OpenDialog?
Как добавить функцию прослушивания музыкальных файлов в формате mp3 при открытии в OpenDialog?

18
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
04.09.2009, 23:05 2
Да обработчик не тот. Кинь на форму кнопку, вот код ее обработчика

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    // пользователь выбрал файл грузим его в мемо
    Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
  end;
end;
1
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
04.09.2009, 23:22  [ТС] 3
Извините, но мне необходимо именно тем способом, которым я делал.
Это не моя прихоть, а лабораторная работа с интститута.

Возможно ли так?
Спасибо.
0
3067 / 727 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
05.09.2009, 01:03 4
Цитата Сообщение от Win32 Посмотреть сообщение
Возможно ли так?
А Вы напишите полное задание и мы докажем Вашему преподавателю, что можно решать совершенно разными путями.
1
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
05.09.2009, 02:30  [ТС] 5
Задание было просто в цикле прочитать файл, что в принципе я и сделал.
При этом я захотел добавить выбор файла, а не просто чтение стандартного, т.е. просто прописать к нему путь, но столкнулся с проблемой в OpenDialog ;(

Воть... Если бы Вы подсказали как мне "вывернуться" теперь, я был бы безгранично признателен! )))
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
05.09.2009, 09:15 6
А какой полный код Вашей программы?

polivets предложил абсолютно верный вариант!
А что в Вашей программе?
1. Вы запускаете opendialog (очевидно какой-то кнопкой).
2. Затем (если у Вас настроено) при выборе файла сразу срабатывает обработчик события OpenDialog1SelectionChange.

А polivets предложил так:
1. Вы запускаете opendialog (очевидно какой-то кнопкой).
2. Затем выбираете любой файл в любом каталоге, щелкаете по нему два раза (или нажимаете ОК) и только после этого начинается работа с файлом: чтение, вывод и т.п.

Что не устраивает?

Добавлено через 2 минуты
т.е. это будет делать что и Ваша программа, только после двойного щелчка по имени файла:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute=false then exit;
 
//Ваша часть программы
Memo1.Clear();
Assignfile(ChoisedFile,OpenDialog1.FileName);
Reset(ChoisedFile);
while(not Eof(ChoisedFile)) do
begin
ReadLn(ChoisedFile, FileText);
Memo1.Text := TrimLeft(Memo1.Text+#13#10+FileText);
end;
CloseFile(ChoisedFile);
Form1.Caption := ExtractFileName(OpenDialog1.FileName)+' - Блокнот';
end;
1
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
05.09.2009, 13:51 7
Цитата Сообщение от Win32 Посмотреть сообщение
Задание было просто в цикле прочитать файл, что в принципе я и сделал.
При этом я захотел добавить выбор файла, а не просто чтение стандартного, т.е. просто прописать к нему путь, но столкнулся с проблемой в OpenDialog ;(

Воть... Если бы Вы подсказали как мне "вывернуться" теперь, я был бы безгранично признателен! )))
Интересно было бы взглянуть на форму Вашего приложения. Как вы иницализируете процесс "в цикле прочитать файл". Обычно, это делается, как реакция на нажатие кнопки или пункта меню. Или в крайнем случае, в обработчике FormCreate. Вот туда - то и нужно вставить строку

Delphi
1
if OpenDialog1.Execute then
Документация Delphi:
Use Execute method to display the dialog box. Execute returns true when the user makes a selection and clicks OK, and returns false when the user closes the dialog without making a selection.
В любом случае, документация рулит
rtfm, одним словом. Магическое слов - TOpenDialog. Может и найдешь, что тебе надо.
1
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
05.09.2009, 16:07  [ТС] 8
Всё получилось!

Спасибо вам большое )))

Добавлено через 32 минуты
Извините, а вы не подскажите как реализовать чтение файла по двойному клику (по файлу)...
Я имею ввиду просто открытие файла с помощью моей программы.
???
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
05.09.2009, 16:30 9
Т.е. хотите ассоциировать, какой-либо тип файла (по расширению) с вашей программой? Например, как блокнот открывает файлы с расширением txt?
1
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
05.09.2009, 16:34  [ТС] 10
Именно.
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
05.09.2009, 16:38 11
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
uses
  Registry;
  
{ ... }
 
// ---------------   
// ассоциируем файл с нашей программой
// ---------------
procedure SetupExtension;
var
    Reg: TRegistry;
begin
    Reg := TRegistry.Create;
 
    reg.RootKey := HKEY_CLASSES_ROOT;
    reg.LazyWrite := false;
 
    // ассоциируем файлы с расширением .TRY с MyProgram.Project
    reg.OpenKey('.try', true);
    reg.WriteString('', 'MyProgram.Project');
    reg.CloseKey;
 
    // записываем описание типа файла
    reg.OpenKey('MyProgram.Project', true);
    reg.WriteString('', 'MyProgram try file');
    reg.CloseKey;           
 
    // записываем команду запуска         
    reg.OpenKey('MyProgram.Project\shell\open\command', true);
    reg.WriteString('', Application.ExeName + ' "%1"');
    reg.CloseKey;
 
    // ассоциируем с файлам '.TRY' иконку нашего приложения
    reg.OpenKey('MyProgram.Project\DefaultIcon',true);
    reg.WriteString('', Application.ExeName + ',1');
    reg.CloseKey;
    
    Reg.Free;
end;
только подправьте строки, на те что нужно вам - это процедура установки, нужно, чтобы Ваша программа была запущена от имени пользователя из группы администраторы.
3
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
05.09.2009, 16:54  [ТС] 12
Спасибо большое - это действительно полезная инофрмация, однако меня больше итересовало как именно словить текст файла в Memo, если открыть файл с "Открыть с помощью..."!

Т.е. Я уже умею прочитать файл с помощью OpenDialog благодаря Вам, а вот как словить текст если я не программу свою открываю, а сам файл с помощью моей программы?
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
05.09.2009, 17:05 13
Если Вы не выполните ассоциацию, то ОС не будет передавать вашей программе, путь к файлу, на который пользовал нажал.

Вот приблизительное использование в нем в кратце описано, как работать с командной строкой. Советую поискать на нашем форуме инфу по данной теме (Командная строка, ParamStr).

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
procedure TForm1.FormCreate(Sender: TObject);
var FileName : String;
begin
  FileName := '';
  if ParamCount = 1 then
  begin
    // если программа запущена по дв клику на
    // файле с расширением ассоциированном с ней
    // или присутсвуют доп параметры
    if ParamStr(1)='/install' then
    begin                         
      // проверям есть ли ключ для установки
      // если программа запущена, например
      // с:\Project1.exe /install
      // то выполняем ассоциацию 
      SetupExtension;                
    end else if ParamStr(1)='/uninstall' then
    begin
      // проверям есть ли ключ для удаления ассоциации
      // с:\Project1.exe /uninstall
      // то выполняем удаление из реестра информации
      // о нашей проге      
    end else
    begin
      // иначе, делаем предположение, что в параметре
      // командной строки путь к файлу
      // с:\Project1.exe d:\documents\file.typ
      FileName := ParamStr(1);
      // в FileName будет d:\documents\file.typ
    end;
  end                      
  else                                      
  begin
    // программа запущена по дв клику на исполнимом файле
  end;                         
                         
  // здесь в FileName путь к выбранному пользователем файлу
  // или пустая строка просто отображем что в этой переменной     
 
  ShowMessage(FileName);
end;
1
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
05.09.2009, 18:52  [ТС] 14
Ой... Подскажите пожалуйста последний раз!!!!

Вот я попробовал так сделать, получилось следующее:

FileName ловит нормальный путь к файлу, т.е. все нормально после двойного щелчка по файлу в приложение передаёться адрес этого файла, НО почему то не может его прочитать, выдаёт ошибку I/O 6 - Что это и как с этим бороться??

Заранее спасибо!!!

Добавлено через 43 минуты
Вот ещё. Если файл пустой, то он нормально читаеться и даже сохраняеться, но если файл НЕ пустой, то возникает данная ошибка!

Добавлено через 42 секунды
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, Inifiles, Registry;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    N18: TMenuItem;
    N19: TMenuItem;
    N20: TMenuItem;
    N21: TMenuItem;
    N22: TMenuItem;
    N23: TMenuItem;
    N24: TMenuItem;
    N25: TMenuItem;
    N26: TMenuItem;
    N27: TMenuItem;
    N28: TMenuItem;
    N29: TMenuItem;
    N30: TMenuItem;
    N31: TMenuItem;
    N32: TMenuItem;
    N33: TMenuItem;
    N34: TMenuItem;
    OpenDialog1: TOpenDialog;
    PrintDialog1: TPrintDialog;
    procedure N12Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N28Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1       : TForm1;
  ChoisedFile : TextFile;
  FileText    : string;
  Ini         : Tinifile;
  FileName    : System.string;
 
implementation
 
{$R *.dfm}
 
procedure SetupExtension;
var
    Reg: TRegistry;
begin
    Reg := TRegistry.Create;
 
    reg.RootKey := HKEY_CLASSES_ROOT;
    reg.LazyWrite := false;
 
    // ассоциируем файлы с расширением .TRY с MyProgram.Project
    reg.OpenKey('.try', true);
    reg.WriteString('', 'MyProgram.Project');
    reg.CloseKey;
 
    // записываем описание типа файла
    reg.OpenKey('MyProgram.Project', true);
    reg.WriteString('', 'MyProgram try file');
    reg.CloseKey;
 
    // записываем команду запуска
    reg.OpenKey('MyProgram.Project\shell\open\command', true);
    reg.WriteString('', Application.ExeName + ' "%1"');
    reg.CloseKey;
 
    // ассоциируем с файлам '.TRY' иконку нашего приложения
    reg.OpenKey('MyProgram.Project\DefaultIcon',true);
    reg.WriteString('', Application.ExeName + ',1');
    reg.CloseKey;
 
    Reg.Free;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
FileName := '';
if ParamCount = 1 then
begin
// если программа запущена по дв клику на
// файле с расширением ассоциированном с ней
// или присутсвуют доп параметры
if ParamStr(1)='/install' then
begin
// проверям есть ли ключ для установки
// если программа запущена, например
// с:\Project1.exe /install
// то выполняем ассоциацию
SetupExtension;
end else if ParamStr(1)='/uninstall' then
begin
// проверям есть ли ключ для удаления ассоциации
// с:\Project1.exe /uninstall
// то выполняем удаление из реестра информации
// о нашей проге
end else
begin
// иначе, делаем предположение, что в параметре
// командной строки путь к файлу
FileName:=ParamStr(1);
end;
end
else
begin
// программа запущена по дв клику на исполнимом файле
end;
// здесь в FileName путь к выбранному пользователем файлу
// или пустая строка просто отображем что в этой переменной
if FileExists(FileName) then
begin
ShowMessage(FileName);
Assignfile(ChoisedFile,FileName);
Reset(ChoisedFile);
while(not Eof(ChoisedFile)) do
begin
ReadLn(FileName, FileText);
Memo1.Text := TrimLeft(Memo1.Text+#13#10+FileText);
end;
CloseFile(ChoisedFile);
Form1.Caption := ExtractFileName(FileName)+' - Блокнот';
end;
 
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+ 'Config.ini');
Form1.Width:=Ini.ReadInteger('Size','Width',570);
Form1.Height:=Ini.ReadInteger('Size','Height',388);
Form1.Left:=Ini.ReadInteger('Position','X',110);
Form1.Top:=Ini.ReadInteger('Position','Y',110);
Form1.N28.Checked:=Ini.ReadBool('Buttons','Horizontal',true);
Ini.Free;
if ( Form1.N28.Checked=false ) then
Form1.Memo1.ScrollBars:=ssBoth
else
Form1.Memo1.ScrollBars:=ssVertical
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
if (Form1.WindowState=wsNormal) then
begin
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+ 'Config.ini');
Ini.WriteInteger('Size','Width',form1.width);
Ini.WriteInteger('Size','Height',form1.height);
Ini.WriteInteger('Position','X',form1.left);
Ini.WriteInteger('Position','Y',form1.top);
Ini.WriteBool('Buttons','Horizontal',form1.N28.checked);
Ini.WriteBool('Buttons','Vertical',true);
Ini.Free;
end;
end;
 
procedure TForm1.N10Click(Sender: TObject);
begin
Form1.PrintDialog1.Execute();
end;
 
procedure TForm1.N12Click(Sender: TObject);
begin
Application.Terminate();
end;
 
procedure TForm1.N28Click(Sender: TObject);
begin
if ( Form1.N28.Checked=false ) then
Form1.Memo1.ScrollBars:=ssBoth
else
Form1.Memo1.ScrollBars:=ssVertical
end;
 
procedure TForm1.N5Click(Sender: TObject);
begin
if OpenDialog1.Execute=false then exit;
Memo1.Clear();
Assignfile(ChoisedFile,OpenDialog1.FileName);
Reset(ChoisedFile);
while(not Eof(ChoisedFile)) do
begin
ReadLn(ChoisedFile, FileText);
Memo1.Text := TrimLeft(Memo1.Text+#13#10+FileText);
end;
CloseFile(ChoisedFile);
Form1.Caption := ExtractFileName(OpenDialog1.FileName)+' - Блокнот';
end;
 
procedure TForm1.N6Click(Sender: TObject);
begin
if FileExists(FileName) then
begin
Assignfile(ChoisedFile,FileName);
Reset(ChoisedFile);
ReWrite(ChoisedFile);
WriteLn(ChoisedFile,Memo1.Text);
CloseFile(ChoisedFile);
end else
begin
Assignfile(ChoisedFile,OpenDialog1.FileName);
Reset(ChoisedFile);
ReWrite(ChoisedFile);
WriteLn(ChoisedFile,Memo1.Text);
CloseFile(ChoisedFile);
end;
end;
 
end.
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
05.09.2009, 19:47 15
Для меня осталось загадкой, что все же делает N6Click (хотя бы для себя пишите комментарии, а тем более, если Вы хотите, чтобы Ваш код кто-то понял), но предположу, что здесь происходит сохранение содержимого Memo1 в текстовый файл. Так вот, весь этот код можно заменить на
Delphi
1
  Memo1.Lines.SaveToFile(FileName);
Добавлено через 5 минут
Ну а если, допустим, Вам нужно, обязательно в цикле сохранять, то
Delphi
1
2
3
4
5
  Assignfile(ChoisedFile, FileName);
  ReWrite(ChoisedFile);
  for i:=1 to Memo1.Lines.Count-1 do
    WriteLn(ChoisedFile, Memo1.Lines.Strings[i]);
  CloseFile(ChoisedFile);
Но это велосипед, и лучше использовать первый вариант.
2
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
05.09.2009, 19:59  [ТС] 16
Это понял. Так, а по открытию что?

Добавлено через 6 минут
Спасибо большое. Всё получилось...
0
96 / 96 / 16
Регистрация: 28.01.2008
Сообщений: 426
28.10.2010, 17:43 17
Delphi
1
2
3
4
    // ассоциируем файлы с расширением .TRY с MyProgram.Project
    reg.OpenKey('.try', true);
    reg.WriteString('', 'MyProgram.Project');
    reg.CloseKey;
Что в данном случае означает "MyProgram.Project"??? Объясните пожалуйста!
0
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
28.10.2010, 18:22  [ТС] 18
Прошло больше года и вот я снова здесь уже с достаточным багажом знаний! Спасибо большое всем кто мне год назад тут помогал!

Цитата Сообщение от Sanprof Посмотреть сообщение
Delphi
1
2
3
4
    // ассоциируем файлы с расширением .TRY с MyProgram.Project
    reg.OpenKey('.try', true);
    reg.WriteString('', 'MyProgram.Project');
    reg.CloseKey;
Что в данном случае означает "MyProgram.Project"??? Объясните пожалуйста!
MyProgram.Project - это всего лишь ключ. Его Вы можете заменить (только везде тогда) на свой, это роли не играет
1
96 / 96 / 16
Регистрация: 28.01.2008
Сообщений: 426
28.10.2010, 18:49 19
Пасиб, а то я подумал, что здесь MyProgram.Project будет выполнять определенные действия в моей программе, и будет зависеть от того, что там напишешь.
0
28.10.2010, 18:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2010, 18:49
Помогаю со студенческими работами здесь

Компонент: свойство вызова OpenDialog
Делаю компонент который работает с изображениями. Для загрузки используется OpenDialog, только вот...

Хочу сделать свой OpenDialog
Пытался сделать с помощью ShellApi ничего не получилось :( подскажите плиз как сделать.

Что такое if opendialog.execute then showmessage(..) ?
Странно, то ли я раньше просто никогда не замечала, то ли что-то грохнулось в винде или где, но...

OpenDialog, SaveDialog, FontDialog, ColorDialog, PrintDialog
Дано имя файла целых чисел. Вывести количество его элементов. Если файла с таким именем не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru