Открытие файла по двойному щелчку мышкой

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Открытие файла по двойному щелчку мышкой

Сообщение resident » 05.06.2013 16:23:43

Подскажите, как сделать открытие файла. Код из Делфи не проходит.
Пишет Error: Illegal Qualifier на .lpData

Код: Выделить всё
type
  TfMain = class(TForm)
    ...
    public
      { public declarations }
      procedure ReceiveMessageForLoad(var Msg: TMessage); message WM_COPYDATA;
    end;
...
var
  RecievedStr: AnsiString = '';

procedure TfMain.ReceiveMessageForLoad(var Msg: TMessage);   
  var
    pcd : PCopyDataStruct;
    DlgSelected: integer;
  begin
    pcd := PCopyDataStruct(Msg.LParam);
    RecievedStr:=string(PAnsiChar(pcd.lpData)); // <<<<< РУГАЕТСЯ ЗДЕСЬ на .lpData
   ...
    // загрузка нового файла
    file_name:=string(RecievedStr); // строковая переменная
    file_open; // процедура открытия
  end;
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Открытие файла по двойному щелчку мышкой

Сообщение Mr.Smart » 05.06.2013 16:33:24

Код: Выделить всё
RecievedStr:=string(PAnsiChar(pcd^.lpData));
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Открытие файла по двойному щелчку мышкой

Сообщение resident » 05.06.2013 16:41:03

Спасиб, работает! :)

Добавлено спустя 36 минут 56 секунд:
Эх, файлы с русскими буквами в названии не читает. :roll:
Пробовал по всякому:
Код: Выделить всё
var
  RecievedStr: String = '';     
...
RecievedStr := ansitoutf8(AnsiString(PAnsiChar(pcd^.lpData)));

Код: Выделить всё
RecievedStr: AnsiString = '';
...
RecievedStr := AnsiString(PAnsiChar(pcd^.lpData)); 

Код: Выделить всё
var
  RecievedStr: String = ''; 
...
RecievedStr := ansitoutf8(PAnsiChar(pcd^.lpData));
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Открытие файла по двойному щелчку мышкой

Сообщение Лекс Айрин » 05.06.2013 18:05:11

resident, SysToUTF8(MyFile) пробовали?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Открытие файла по двойному щелчку мышкой

Сообщение resident » 06.06.2013 17:18:15

Лекс Айрин писал(а):SysToUTF8(MyFile) пробовали?


Попробовал, только не понятно в какой комбинации.
И CP1251ToUTF8 пробовал. И PAnsiChar на PChar менял, и AnsiString на String.
Прикол в том, что английские названия в любой комбинации работают, а вот наши буквы везде знаками вопроса. Никак не получается :?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Открытие файла по двойному щелчку мышкой

Сообщение Лекс Айрин » 06.06.2013 17:45:12

resident У меня процедура сохранения такова:
Код: Выделить всё
var
  Form1: TForm1;
  MyFile, FileTree:string;

Procedure F_Save;
Var
   Str:TStringList;
   txt:string;
begin
     {проверить, не будут ли вылазить косяки в линуксе}
  Str:=TStringList.Create;
  txt:=Form1.MainEditor.Text;
  Str.Add(txt);
  Str.SaveToFile(UTF8ToAnsi(MyFile)); //общее сохранение <<<<<<<<<------------------------------

  Form1.Caption:=MyFile+'             LexEditor';
  Str.Free;

end;             


procedure TForm1.MenuItem10Click(Sender: TObject);
  Begin
       F_save; // вынесено в процедуру, для возможности использования в "Сохранить как"
  End;

procedure TForm1.MenuItem11Click(Sender: TObject);
Var
    tmpFile:string;
begin
  tmpFile:=MyFile;
  Form1.SaveDialog1.FileName:=MyFile;
  If Form1.SaveDialog1.Execute then
  Begin
    MyFile:= Form1.SaveDialog1.FileName;
    F_Save;

  end
  else
      Begin
           MyFile:=tmpFile;
      end;
end;     

все работает

ЗЫ: а SysToUTF8(MyFile) у меня в другом месте работает (( эт я тогда прокосячил с советом :oops:
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Открытие файла по двойному щелчку мышкой

Сообщение resident » 06.06.2013 20:21:23

Лекс Айрин писал(а):У меня процедура сохранения такова


Не пойму причем здесь сохранение?
У меня ж загрузка не работает. А сохранение разве что-то изменит? Например, беру нормально загружаемый файл "test.myext" и переименовываю в проводнике Виндовс на наши буквы "тест.myext". Больше файл не грузится, переименовываю на английские обратно - грузится.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Открытие файла по двойному щелчку мышкой

Сообщение Лекс Айрин » 06.06.2013 20:52:04

residentresident, пардон... зашиваюсь (((

вот здесь, и правда работает UTF8ToSys(MyFile). Почему такая несправедливость не помню, но все работает. Могу, для пробы, предоставить весь код.
Код: Выделить всё
procedure TForm1.MenuItem8Click(Sender: TObject);  // в работе
var
  Str:TStringList;
begin
  Str:=TStringList.Create;
  if OpenDialog1.Execute then
       Begin
            MyFile:=OpenDialog1.FileName;
            Form1.Caption:=MyFile+'             LexEditor';
            // ожидается выбор кодировки текста

           Case OpenDialog1.FilterIndex of
             1:begin
                 {$IFDEF MSWINDOWS}
                 Str.LoadFromFile(UTF8ToSys(MyFile));
                 {$ENDIF}
                 {$IFDEF LINUX} Str.LoadFromFile(MyFile);   {$ENDIF}
                 Form1.MainEditor.Lines:=Str;
               end;
              2:Begin
                {$IFDEF MSWINDOWS}
                 Str.LoadFromFile(UTF8ToSys(MyFile));
                 {$ENDIF}
                 {$IFDEF LINUX} Str.LoadFromFile(MyFile);   {$ENDIF}

                 Form1.MainEditor.Lines.Text:=CP1251ToUTF8(Str.Text);

              end;
              else begin end;
             end;
       end
  else Begin end;
  Str.Free;
end;
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Открытие файла по двойному щелчку мышкой

Сообщение resident » 06.06.2013 21:11:30

Лекс Айрин писал(а):Могу, для пробы, предоставить весь код.


Спасиб, пока наверное не нужно.
А у Вас в коде есть загрузка по двойному щелчку?
Просто через OpenDialog у меня вообще без всяких конвертаций открывается.
Не работает именно загрузка двойным щелчком по файлу. Нда
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Открытие файла по двойному щелчку мышкой

Сообщение Лекс Айрин » 06.06.2013 21:53:59

resident, tсли честно, не могу понять что именно Вам надо. Открытие файлов внутри Вашей программы? Или открытие программы в системе (ОС) двойным кликом по файлу? К тому же из выложенной части кода непонятно как вызывается метод. Да и как именно сохраняется файл?

resident писал(а):Просто через OpenDialog у меня вообще без всяких конвертаций открывается.


Попробуйте использовать ShowMessage, для проверки текстовой строки и подбора нужного преобразования.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Открытие файла по двойному щелчку мышкой

Сообщение resident » 06.06.2013 22:23:11

Лекс Айрин писал(а):Или открытие программы в системе (ОС) двойным кликом по файлу?

Да, это именно и надо. Чего-то я не то делал :oops: . Надо было в конструктор формы записать:

Код: Выделить всё
    FileName := '';
    If ParamCount > 0 then
      FileName := AnsiToUTF8(ParamStr(1));
    if FileName <> ''
      then LoadFromFile;
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Открытие файла по двойному щелчку мышкой

Сообщение Лекс Айрин » 06.06.2013 22:36:41

resident, по тому коду, что есть....
resident писал(а):then LoadFromFile;


Что открываем-с?
У меня так-с...
Код: Выделить всё
if ParamStr(1)='' then   <<------------ внимание, здесь пустая строка!!
        begin
        end
     else Begin
               MyFile:=systoutf8(paramStr(1)+'             LexEditor'); 
               Form1.MainEditor.Lines.LoadFromFile(ParamStr(1));


           End;
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Открытие файла по двойному щелчку мышкой

Сообщение resident » 06.06.2013 22:49:52

Лекс Айрин писал(а):Что открываем-с?


LoadFromFile? Так это у меня процедура так называется :)
Параметры проекта хранятся в xml файле, вот эта процедура его и отрывает.

Лекс Айрин писал(а):systoutf8(paramStr(1)


Попробовал, и так (systoutf8) тоже грузит файлы с нашими названиями.
Но оставил все-таки AnsiToUTF8, т.к. ParamStr объявлена как Ansi.
Код: Выделить всё
Function ParamStr(Param : Integer) : Ansistring; 
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Открытие файла по двойному щелчку мышкой

Сообщение Лекс Айрин » 06.06.2013 23:48:35

resident, не путай, преобразование, которое ты привел, идет для совершенно левых, в контексте разговора, целей... а именно, для отображения в заголовке окна и сохранения строки пути для дальнейшего сохранения файла (не открытия). Попробуй ничего не преобразовывать. Хотя, как я понял, проблему ты уже решил...

Кстати, там ошибка, правильнее эту строчку читать так:
Код: Выделить всё
MyFile:=systoutf8(paramStr(1));
Form1.Caption:=UTF8ToSys(MyFile)+'             LexEditor';

И непонятно почему я это пропустил ((
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Открытие файла по двойному щелчку мышкой

Сообщение resident » 07.06.2013 09:56:13

Лекс Айрин писал(а):Попробуй ничего не преобразовывать.


Так до этого ничего и не преобразовывал (переделываю прогу с Делфи, и забыл, что в конструкторе формы это было). В результате наши названия не открывались. Вроде сейчас работает, спасиб.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 233

Рейтинг@Mail.ru