QPas - квесты на Pascal'e

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

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

Re: QPas - квесты на Pascal'e

Сообщение Odyssey » 06.10.2010 22:25:32

Apromix писал(а):Вопрос 1, вот я знаю путь к временному каталогу и мне нужно будет в него распаковать архив в отдельный каталог.

А может и не распаковывать, а прям в памяти, через Stream'ы? Вроде бы TZipper позволяет. Я понимаю что в примере по ссылке показано через временные файлы, но лучшего примера я не нашёл :) Зато если чуть покопаться в исходниках Zipper'а, можно понять как организовать доступ через Stream'ы.

По (2): рад если ошибаюсь, но по-моему нет. Тут нужно будет искать кроссплатформенное решение, возможно с использованием английского форума/рассылки, там больше разработчиков LCL.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: QPas - квесты на Pascal'e

Сообщение Apromix » 06.10.2010 23:03:31

А это в Линукс будет работать?

Код: Выделить всё
  Params := '';
  if ParamCount > 0 then
  begin
    for I := 1 to ParamCount do Params := Trim(Params + ' ' + ParamStr(I));
    RunQuest(Path + Params);
  end;


Добавлено спустя 4 минуты 7 секунд:
Odyssey писал(а):А может и не распаковывать, а прям в памяти, через Stream'ы? Вроде бы TZipper позволяет.


Если чесно, не знаю как тогда работать со звуком и изображениями :) Может, позднее, если возникнет в этом острая необходимость, то сделаю через потоки :) Но идея хороша.
Apromix
новенький
 
Сообщения: 28
Зарегистрирован: 06.10.2010 15:15:51
Откуда: Черновцы, Украина

Re: QPas - квесты на Pascal'e

Сообщение dunin » 06.10.2010 23:16:46

Apromix писал(а):
Код: Выделить всё
function GetRandomDirName: string;
begin
  Randomize;
  Result := Trim(IntToStr(Round(Random(888888888) + 111111111)));
end;

Для чего
Код: Выделить всё
Trim
?

Добавлено спустя 3 минуты 4 секунды:
Apromix писал(а):
Код: Выделить всё
  Params := '';
  if ParamCount > 0 then
  begin
    for I := 1 to ParamCount do Params := Trim(Params + ' ' + ParamStr(I));
    RunQuest(Path + Params);
  end;

Да вроде и здесь тримить не к чему...
"Trim" ставится по принципу "на всякий случай где строка - хуже не будет"?
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: QPas - квесты на Pascal'e

Сообщение Apromix » 06.10.2010 23:23:37

Trim наверное ставлю по привычке чтобы быть на 200% уверенным в верности результата :)

Добавлено спустя 22 минуты 51 секунду:
Создал архив 1.zip в корне проекта. Подключил модуль Zipper. Подскажите, как распаковать архив? Что там за метод это делает?

Код: Выделить всё
  FZip := TZipper.Create;

  FZip.FileName := '1.zip';

  FZip.Free;
Apromix
новенький
 
Сообщения: 28
Зарегистрирован: 06.10.2010 15:15:51
Откуда: Черновцы, Украина

Re: QPas - квесты на Pascal'e

Сообщение Alexx2000 » 06.10.2010 23:49:03

Apromix писал(а):Вопрос 2, я перетягиваю архив на форму (drag-n-drop) и он открывается в Виндовс. То же будет и в Линукс без изменений кода?

Если использовать событие TForm.FormDropFiles, то будет. Пример использования можно найти в каталоге - lazarus/examples/dropfiles
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: QPas - квесты на Pascal'e

Сообщение Apromix » 07.10.2010 10:34:03

Apromix писал(а):Создал архив 1.zip в корне проекта. Подключил модуль Zipper. Подскажите, как распаковать архив? Что там за метод это делает?

Код: Выделить всё
  FZip := TZipper.Create;

  FZip.FileName := '1.zip';

  FZip.Free;


Использовал TUnZipper. Но не могу понять, как извлечь файлы из архива.

Код: Выделить всё
  FZip := TUnZipper.Create;
  FZip.FileName := '1.zip';
Apromix
новенький
 
Сообщения: 28
Зарегистрирован: 06.10.2010 15:15:51
Откуда: Черновцы, Украина

Re: QPas - квесты на Pascal'e

Сообщение amateur » 07.10.2010 17:17:15

Проблем со слешами не будет, но есть возможность нарваться на проблемму с UTF8.


Не по теме. Намедни делал маленький "бяка".
Т.е.: есть таблица в sqlite, нуно было оттуда данные вытянуть и красиво распечатать (инструменты : лазреп и стандартные компоненты из палитры(для доступа)). Все в винде. Пределу удивления не было конца: доступ (путь к файлу базы указывался нормально (без доп. функц. преобразования)) а вот в лазреп. пришлось "пальцем тыкать": мол мил человек ты работаеш в код. 1251 а не утф поэтому путь к файлу отчетов пожалуйста не брякозябликами...
Плюс "странности" в свойствах страницы, а в лазаре 0.9.28 когда в предварительном просмотре на печать включаем :)
Так что, вроде проблем нет Но странностей выше крыши. Не допиляли еще лазарь с кодировками. Хотя, может всех нюансов не изучил??

Хотя сел за дельфина 10 и.... мдя мсе да и лазарь пошли по функционалу дальше. Мсе вообще мона назвать уникумом, в хорошом смысле слова, лазарь не тянет до него (в лазаре и удобно работать, но мсе компонентами перебивает лазарь, да и стабильнее он (окромя генератора отчетов)).
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: QPas - квесты на Pascal'e

Сообщение Odyssey » 07.10.2010 19:34:50

По поводу TUnZipper:
http://www.webdelphi.ru/2010/01/vojna-s ... edka-boem/

если вкратце то:

Код: Выделить всё
with TUnZipper.Create do
  begin
    FileName:=AFile;
    OutputPath:=FSaveDir;
    UnZipAllFiles;
  end;

for i:=0 to Entries.Count-1 do
  begin
    ShowMessage(Entries[i].ArchiveFileName)
  end;
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: QPas - квесты на Pascal'e

Сообщение Apromix » 07.10.2010 21:06:23

Cпасибо, работает. Создаю папку и распаковываю архив. После работы программы нужно удалить эту папку со всем содержимым. Хотелось бы кроссплатформенный вариант такой процедуры.
Apromix
новенький
 
Сообщения: 28
Зарегистрирован: 06.10.2010 15:15:51
Откуда: Черновцы, Украина

Re: QPas - квесты на Pascal'e

Сообщение Mr.Smart » 07.10.2010 21:15:33

DeleteFile или лучше DeleteFileUTF8
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: QPas - квесты на Pascal'e

Сообщение Apromix » 07.10.2010 21:41:47

Ну вот как эту процедурку (удаляет папку вместе с содержимым) переделать под кросс?

Код: Выделить всё
function RemDir(sDir : String) : Boolean;
var
  iIndex: Integer;
  SearchRec: TSearchRec;
  sFileName: String;
begin
  Result := False;
  sDir := sDir + PathDelim + '*.*';
  iIndex := FindFirst(sDir, faAnyFile, SearchRec);
  while iIndex = 0 do
  begin
    sFileName := ExtractFileDir(sDir) + PathDelim + SearchRec.Name;
    if SearchRec.Attr = faDirectory then
    begin
      if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.')
        and (SearchRec.Name <> '..') then RemDir(sFileName);
    end
    else
    begin
      if SearchRec.Attr <> faArchive then FileSetAttr(sFileName, faArchive);
      if not DeleteFile(sFileName) then ShowMessage('Could not delete ' + sFileName + ' !');
    end;
    iIndex := FindNext(SearchRec);
  end;
  FindClose(SearchRec);
  RemoveDir(ExtractFileDir(sDir));
  Result := True;
end;
Apromix
новенький
 
Сообщения: 28
Зарегистрирован: 06.10.2010 15:15:51
Откуда: Черновцы, Украина

Re: QPas - квесты на Pascal'e

Сообщение Mr.Smart » 07.10.2010 21:59:29

Да. Только я бы данную строку написал так:
Код: Выделить всё
sDir := IncludeTrailingBackslash(Utf8ToSys(sDir)) + '*.*';
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: QPas - квесты на Pascal'e

Сообщение Apromix » 07.10.2010 22:14:42

Ну вот заделал модуль AZip (открывает архив в отдельном каталоге во временной папке и потом удаляет его):

Код: Выделить всё
unit AZip;

{$MODE Delphi}

interface

uses Zipper, SysUtils, Classes;

type
  TAZip = class
  private
    FTempDirName: string;
    FZF: TUnZipper;
    FIsOpened: Boolean;
    function GetTempDirPath: string;
    procedure MakeTempDir(const ATempDir: string);
    function GetRandomDirName: string;
    procedure SetTempDirName(const Value: String);
    procedure SetIsOpened(const Value: Boolean);
    procedure CloseSession;
    property TempDirName: string read FTempDirName write SetTempDirName;
    property IsOpened: Boolean read FIsOpened write SetIsOpened;
  public
    procedure OpenSession(const AFileName: string);
    function GetFullFileName(const FileName: string): string;
    constructor Create;
    destructor Destroy;
  end;

implementation

function RemDir(sDir : String) : Boolean;
var
  iIndex: Integer;
  SearchRec: TSearchRec;
  sFileName: String;
begin
  Result := False;
  sDir := sDir + PathDelim + '*.*';
  iIndex := FindFirst(sDir, faAnyFile, SearchRec);
  while iIndex = 0 do
  begin
    sFileName := ExtractFileDir(sDir) + PathDelim + SearchRec.Name;
    if SearchRec.Attr = faDirectory then
    begin
      if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.')
        and (SearchRec.Name <> '..') then RemDir(sFileName);
    end
    else
    begin
      if SearchRec.Attr <> faArchive then FileSetAttr(sFileName, faArchive);
      DeleteFile(sFileName);
    end;
    iIndex := FindNext(SearchRec);
  end;
  FindClose(SearchRec);
  RemoveDir(ExtractFileDir(sDir));
  Result := True;
end;

{ TAZip }

function TAZip.GetTempDirPath: string;
begin
  Result := GetTempDir + FTempDirName + PathDelim;
end;

constructor TAZip.Create;
begin
  inherited Create;
  FZF:= TUnZipper.Create;
  IsOpened := False;
end;

destructor TAZip.Destroy;
begin
  FZF.Free;
  CloseSession;
  inherited;
end;

function TAZip.GetFullFileName(const FileName: string): string;
begin
  Result := GetTempDir + FTempDirName + PathDelim + FileName;
end;

procedure TAZip.SetTempDirName(const Value: String);
begin
  FTempDirName := Value;
end;

procedure TAZip.MakeTempDir(const ATempDir: string);
var
  S: String;
begin
  SetTempDirName(ATempDir);
  S := GetTempDir + GetRandomDirName + PathDelim;
  if not DirectoryExists(S) then MkDir(S);
end;

procedure TAZip.CloseSession;
begin
  if IsOpened then RemDir(GetTempDir + FTempDirName + PathDelim);
end;

procedure TAZip.OpenSession(const AFileName: string);
begin
  // Закрываем предыдущую сессию
  CloseSession;
  // Начинаем новую
  MakeTempDir(GetRandomDirName);
  IsOpened := True;
  with FZF do
  begin
    FileName := '1.zip';
    OutputPath := GetTempDirPath;
    UnZipAllFiles;
  end;
end;

function TAZip.GetRandomDirName: string;
begin
  Randomize;
  Result := IntToStr(Round(Random(888888888) + 111111111));
end;

procedure TAZip.SetIsOpened(const Value: Boolean);
begin
  FIsOpened := Value;
end;

end.


Думаю, наступил на немало грабель :)

Добавлено спустя 14 часов 40 минут 4 секунды:
Небольшая проблемка со скриптами. Если написать скрипт типа:

Код: Выделить всё
repeat ... until ...;


То приложение не закрывается (закрывается только если цикл выполняется до конца и происходит выход из него), если щелкнуть на квестик скажем. Подскажите, что нужно делать?
Apromix
новенький
 
Сообщения: 28
Зарегистрирован: 06.10.2010 15:15:51
Откуда: Черновцы, Украина

Re: QPas - квесты на Pascal'e

Сообщение B4rr4cuda » 08.10.2010 21:21:36

Application.ProcessMessages влепить в цикл.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: QPas - квесты на Pascal'e

Сообщение Apromix » 09.10.2010 11:10:31

B4rr4cuda писал(а):Application.ProcessMessages влепить в цикл.


Да, и еще в FormCloseQuery добавил:

Код: Выделить всё
if CanClose then Halt(0);


Добавлено спустя 36 секунд:
Теперь все работает как надо :)
Apromix
новенький
 
Сообщения: 28
Зарегистрирован: 06.10.2010 15:15:51
Откуда: Черновцы, Украина

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru