Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/75: Рейтинг темы: голосов - 75, средняя оценка - 4.76
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174

Распаковщик псевдо архивов

27.05.2012, 22:26. Показов 15395. Ответов 148
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть такая
Нужно написать распаковщик псевдо архивов.

Выглядит примерно так. Форму создал прописал открытие файлов, вывод (хранения размер)
А дальше стопор.
Встали две основных проблеммы.
Суть проблем такая
1 В окне открываешь файл (любой)
2 В окне открываешь таблицу смещения вида
000016#000020#_file1
000020#000040#_file2
000040#000060#_file3
....
....
в третьем указываешь папку - куда все распаковать.
Жмешь на распаковать
И он разрезает файл согласно заданным смещениям. в файле*.tab
1 вопрос нужно ли добавлять второй диолого на файл с таблицей? Или достаточно 1 -го диалогового окна?
2 вопрос. Не где подобного не нашел. Не плохо бы какойто пример чтоб мне разобратся. А то я встал в тупик.
Примерно выходит так
1 читается первая строчка в *.tab
2 Ищется в файле архива
3 создается файл туда копируется содержимое
4 сохраняется.
Буду примного благодарен за помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2012, 22:26
Ответы с готовыми решениями:

хочу узнать вашу мнение о Упаковщик+распаковщик UPX
хочу узнать вашу мнение о Упаковщик+распаковщик UPX

Псевдо raytracing opengl
Существует ли какой-нибудь псевдо raytracing для opengl? (Ибо raytracing-a настоящего для opengl быть не может)

Построение псевдо-фазовой траектории
В универе задали расчетно-графическую работу: написать программу по теме "Построение псевдо-фазовой траектории"... Помогите пожалуста...

148
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 20:08  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Одиночка Посмотреть сообщение
Так мы можем взять ту же таблицу, немного подправим алгоритм и получим склеенный файл. Так? Я имю в виду, наш алгоритм для распаковки.
Да самый первый.(пост 2)
Про таблицу (DIR, И ФАЙЛ .DAT). забываем(это другая история)

Работает с 1 и 2 постом
Таблица ansi.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.06.2012, 20:23
Я именно последний вариант и имел в виду - работаем с двоичной таблицей, если она есть. А в чём проблема? Там вообще всё легко подогнать под склеивание.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 21:13  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
Я именно последний вариант и имел в виду - работаем с двоичной таблицей, если она есть. А в чём проблема? Там вообще всё легко подогнать под склеивание.
Да которая с юникодом была.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.06.2012, 21:17
Да нет. Последний вариант программы. В которой мы прямо брали двоичную таблицу, извлекали из неё адреса и имена файлов и сразу разрезали файл *dat. Ты мне ещё 2 файла скидывал и я на них тренировался. Там не Юникод, а просто двоичные данные.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 22:45  [ТС]
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DB, DBTables, ExtDlgs, ComCtrls, FileCtrl;
//  Dialogs, StdCtrls, ExtCtrls, TeEngine, Series, TeeProcs, Chart;
 
type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ProgressBar1: TProgressBar;
    Button4: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    TabSheet3: TTabSheet;
    OpenDialog1: TOpenDialog;
    OpenDialog2: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
     Edit1.Text:=OpenDialog1.FileName;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog2.Execute then
    Edit2.Text:=OpenDialog2.FileName;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
path_dir: string;
begin
if SelectDirectory('Путь к папке ','C:\', path_dir) then
Edit3.Text:= (path_dir);
end;
procedure TForm1.Button4Click(Sender: TObject);
Var
    f, OutF : File;         //Нетипизированный файл
    StrList : TStringList;  // Работа со списком строк.
  i, IL, II : Integer;      //Переменные смещения
     BegPos : Integer;     // Начало позиции
     EndPos : Integer;     // Конец позиции
 s, OutFile : String;      //Выходной фаил
  Buf : Array[0..65535] Of Byte;
  Buf1 : WideString;
begin
  StrList:= TStringList.Create;
 
  //Читаем таблицу (Юникод)...
  AssignFile(f,OpenDialog2.FileName);
  Reset(f,SizeOf(WideChar));
  IL:=FileSize(f);
  //Устанавливаем длину Buf1 такую,
  //чтобы в неё поместились данные из файла.
  SetLength(Buf1,IL);
  BlockRead(f,PWideChar(Buf1)^,IL,II); //Читаем файл...
  StrList.Text:=WideCharLenToString(PWideChar(Buf1),II);
  CloseFile(f); //Закрываем файл таблицы
 
  //Само разрезание...
  AssignFile(f,OpenDialog1.FileName);
  Reset(f,1);
  //Настроим ProgressBar...
  ProgressBar1.Min:=0;
  ProgressBar1.Max:=StrList.Count-1;
  For i:=0 To StrList.Count-1 Do
  Begin
    ProgressBar1.Position:=i; //Отображение в ProgressBar
 
    s:=StrList.Strings[i];
//    While s[1]='0' Do Delete(s,1,1);
    BegPos:=StrToInt('$'+Copy(s,1,Pos('#',s)-1));  //Начальная позиция в исходном файле
    Delete(s,1,Pos('#',s));
//    While s[1]='0' Do Delete(s,1,1);
    EndPos:=StrToInt('$'+Copy(s,1,Pos('#',s)-1));  //Конечная позиция в исходном файле
    OutFile:=Copy(s,Pos('#',s)+1,Length(s)-Pos('#',s)); //Имя выходного файла
    AssignFile(OutF,Edit3.Text+'\'+OutFile);
    Rewrite(OutF,1);                //Создаём результирующий файл в указанной директории
    Seek(f,BegPos);                //Указатель на начальную позицию
    While BegPos<=EndPos Do
    Begin
    If (EndPos-BegPos)>65535 Then IL:=65536 Else IL:=EndPos-BegPos+1;
      BlockRead(f,Buf,IL,II);     //Читаем блок из исходного файла
      BlockWrite(OutF,Buf,II);    //Пишем блок в новый файл
      BegPos:=BegPos+II;
    End;
    CloseFile(OutF); //Закрываем выходной файл
  End;
  CloseFile(f); //Закрываем входной файл
StrList.Free 
end;
end.
Вот этой разбирали по таблице. Теперь надо собрать обратно.
Да нет. Последний вариант программы. В которой мы прямо брали двоичную таблицу, извлекали из неё адреса и имена файлов и сразу разрезали файл *dat. Ты мне ещё 2 файла скидывал и я на них тренировался. Там не Юникод, а просто двоичные данные.
А там где таблица .DIR (20 БАЙТ СТРОКА) была. Это промежуток для изучения распаковки. Просто забываем про нее.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.06.2012, 23:10
Только давай уже без Юникода. Хорошо?
Опиши, что там? Смещение, длина и имя файла?

А увидел. Начальный и конечный смещения в конечном файле. Не может быть длина файла больше или меньше этого размера?
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 23:24  [ТС]
Отправил в личку
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
04.06.2012, 16:55
Вот что получилось. На основе таблицы с Юникодом.
Вложения
Тип файла: rar DeArxiver & склейка.rar (1.34 Мб, 15 просмотров)
1
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
04.06.2012, 19:18  [ТС]
Забрал пока тестирую и разбираюсь.
Между делом такой вопрос.
Как поставить проверку на папку (папка выбрана в SаveDialog1)
Описание кнопки
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button3Click(Sender: TObject);
var
path_dir: string;
begin
if SelectDirectory('Путь к папке','C:\', path_dir) then
Edit3.Text:= (path_dir);
end;
На OpenDialog1, OpenDialog1 поставил так:
Delphi
1
2
3
4
   if not FileExists(OpenDialog1.FileName) then begin
    MessageDlg('Не указан файл.', mtError, [mbYes], 0);
    Exit;
   end;
А то что выбрана или нет папка, не где не найду

Добавлено через 7 минут
Мощная сборка получилась. Распаковка проще.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
04.06.2012, 19:26
Есть функция:
Delphi
1
If DirectoryExists('имя директории') Then
А процедура:
Delphi
1
MkDir('путь и имя директории');
создает новый каталог (директорию).
Можно проверить, спросить: Создать? и при ответе Да - создать.
1
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
04.06.2012, 22:41  [ТС]
Одиночка,
создает новый каталог (директорию).
Можно проверить, спросить: Создать? и при ответе Да - создать.
То что надо. Спасибо.

Добавлено через 3 часа 1 минуту
Одиночка,
Спасибо огромное. Все отлично работает. Как обычно пропадаю на 2 дня. Изучаю. Осталось несколько вопросов, но чуть пойже. Надо еще тут разобраться. Сейчас выведу все переменные и через F7, буду вникать в суть.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
07.06.2012, 17:31  [ТС]
Несколько вопросов.
1 Как установить проверку таблицы?
Является она юникодом или нет. Если подключаешь обычную таблицу. То программа падает с критической ошибкой.
2 Можно ли написать пример?
Чтение 'Нетипизированный файлов'
Открываем файл при нажатие кнопки
выводим в Memo по строчно (10 байт в строку)
все данные до метки (200).
4. Если можно
Delphi
1
2
3
4
5
6
Type
  Zap = Record
             NameF : Array[0..11] Of Byte;
             LengFile : Integer;
             BegPos : Integer;
           End;
Опишите по проще. (пост #44). Вроде как писали что можно и проще.
5. Можно ли работать с файлом на прямую(#44) без массивов?
Ну вот и подходит интересная тема к концу.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
07.06.2012, 18:32
По первому вопросу:
Юникодовские символы состоят из двух байт. Первый, кажется равен 0. Это можно сначала проверить и, соответственно лиибо так загружать, либо по другому:
Я подумаю, потом код выложу. Там нужно эксперимент провести.

По второму вопросу:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.Button1Click(Sender: TObject);
Var
  f : File;
  s : String;
  Buf : Pointer;
begin
  GetMem(Buf,10); //Резервируем память для буфера
 
  AssignFile(f,'Файл.ttt'); //Связываем файловую переменную с файлом
  Reset(f,1);               //Открываем файл для чтения
  s:='0123456789';          //Резервируем поле строки
 
  While ((Not Eof(f)) And (FilePos(f)<=200)) Do
  //Обработка, пока не конец файла и позиция в файле до 200
  Begin
    BlockRead(f,Buf^,10,II); //Читаем 10 байт из файла в буфер Buf
    Move(Buf^,s[1],10); //Переносим данные из буфера в строку
    Memo1.Lines.Add(s); //Добавляем строку в Memo
  End;
 
  FreeMem(Buf,10); //Освобождаем память буфера
end;
Правда, если в файле не текстовые данные - в Memo будет ерунда.

По четвёртому вопросу:
Проще можно было так:
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
Type
  Zap = Record
             NameF : String[12];
             LengFile : Integer;
             BegPos : Integer;
           End;
Var
  VarZap : Zap; //Объявили переменную нашего типа
 
.....
 
  While ((Not Eof(fTable)) And Busy) Do
  Begin
    BlockRead(fTable,Zap,SizeOf(Zap),II); //Читаем прямо в нашу переменную
    OutFile:=Zap.NameF;                       //и с ней работаем, а не с буфером
 
    //Само разрезание...
 
    BegPos:=Zap.BegPos; //Начальная позиция в исходном файле
    EndPos:=BegPos+Zap.LengFile;  //Конечная позиция в исходном файле
 
    //Запишем строку в файл отчёта
    s:=IntToHex(BegPos,8)+':'+IntToHex(Zap.LengFile,8)+':'+OutFile;
......
По пятому вопросу:
Я не знаю, как это напрямую. Всё равно если есть отработка, в память нужно считывать. А если просто из файла в файл переписывать. Кажется, как то можно через FileStream. Но с этим я не работал и вообще ничего не могу сказать. Только краем уха слышал и предположил, что такое возможно.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
07.06.2012, 19:13  [ТС]
Слушай такая проблема.
Var
VarZap : Zap; //Объявили переменную нашего типа
При этой переменной бъет на ней ошибку. Стоит Delphi 7(лайт)
В чом может быть проблема?

Все разобрался. Отбой.

Добавлено через 10 минут
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
Program idxndat;
{$APPTYPE CONSOLE}
Uses SysUtils;
Var
    Sz, TF, I, FOffs, FSize: LongInt;
             Fidx, Fdat, Fl: File;
                          P: Pointer;
                          S: String;
Begin
  WriteLn('Rome: Total War .IDX + .DAT file extractor (music, voices and sound ONLY!)');
  WriteLn('You can find it in: \Rome - Total War\Data\sounds');
  WriteLn('T#i$ PR0GR@M bY -=CHE@TER=-');
  WriteLn;
  If ParamCount<>1 Then
    Begin
      WriteLn('Usage: idxndat filename.<idx|dat>');
      WriteLn;
      Exit;
    End;
 
  S:=Copy(ParamStr(1), 1, Length(ParamStr(1)) - 3) + 'idx';
  If Not FileExists(S) Then
    Begin
      WriteLn('Error: index file "', S, '" not exists!');
      Exit;
    End;
  AssignFile(Fidx, S);
  Reset(Fidx, 1);
 
  S:=Copy(ParamStr(1), 1, Length(ParamStr(1)) - 3) + 'dat';
  If Not FileExists(S) Then
    Begin
      WriteLn('Error: data file "', S, '" not exists!');
      CloseFile(Fidx);
      Exit;
    End;
  AssignFile(Fdat, S);
  Reset(Fdat, 1);
 
  SetLength(S, 8);
  BlockRead(Fidx, S[1], 8);
  BlockRead(Fdat, S[1], 8);
  If S<>'SND.PACK' Then
    Begin
      WriteLn('Sorry, this program can extract ONLY "SND.PACK" signatured files.');
      WriteLn('Because "ENV.PACK" archives don''t have file names at all.');
      CloseFile(Fidx);
      CloseFile(Fdat);
      Exit;
    End;
  BlockRead(Fidx, Sz, 4); { $04 }
  BlockRead(Fdat, Sz, 4); { $04 }
  BlockRead(Fidx, TF, 4); { Total Files }
  BlockRead(Fdat, Sz, 4); { Total Files }
  If TF<>Sz Then
    Begin
      WriteLn('Different file counter in data and index file!');
      CloseFile(Fidx);
      CloseFile(Fdat);
      Exit; { Must be equal! }
    End;
  BlockRead(Fidx, Sz, 4); { File start in .dat file?.. }
  BlockRead(Fdat, I, 4); { File start in .dat file?.. }
  If I<>Sz Then { Must be equal! }
    Begin
      WriteLn('Different start offset in data and index file!');
      CloseFile(Fidx);
      CloseFile(Fdat);
      Exit; { Must be equal! }
    End;
  BlockRead(Fidx, Sz, 4); { Key?.. }
  BlockRead(Fdat, I, 4); { Key?.. }
  If I<>Sz Then { Must be equal! }
    Begin
      WriteLn('Different key in data and index file!');
      CloseFile(Fidx);
      CloseFile(Fdat);
      Exit; { Must be equal! }
    End;
  For I:=1 To TF Do
    Begin
      BlockRead(Fidx, FOffs, 4); { File offset }
      BlockRead(Fidx, FSize, 4); { File size }
      Seek(Fidx, FilePos(Fidx) + 12);
      BlockRead(Fidx, Sz, 4); { $0D --- ? }
      SetLength(S, 0);
      Repeat
        Sz:=Length(S) + 1;
        SetLength(S, Sz);
        BlockRead(Fidx, S[Sz], 1);
      Until S[Sz] = #0;
      SetLength(S, Sz - 1);
      WriteLn(S);
      GetMem(P, FSize);
      Seek(Fdat, FOffs);
      BlockRead(Fdat, P^, FSize);
      While Pos('/', S)<>0 Do
        Begin
          Sz:=Pos('/', S);
          If Sz <> 0 Then S[Sz]:=#0;
          If Not DirectoryExists('.\' + PChar(S)) Then MkDir('.\' + PChar(S));
          If Sz <> 0 Then S[Sz]:='\';
        End;
      AssignFile(Fl, '.\' + S);
      ReWrite(Fl, 1);
      BlockWrite(Fl, P^, FSize);
      CloseFile(Fl);
      FreeMem(P, FSize);
 
      SetLength(S, 3);
      BlockRead(Fidx, S[1], 3); { $CD CD CD --- ? }
    End;
  CloseFile(Fdat);
  CloseFile(Fidx);
  WriteLn('Total files: ', TF);
  WriteLn('Done.');
End.
Вот нашел исходничек. Правда он консольный.
Кстати заодно и вопрос. Чем консольный отличается от обычного Delphi 7?
Кроме вывода информации на экран. В консольной
WriteLn
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
07.06.2012, 19:32
Насчёт ошибки. Сразу пиши, что за ошибка. И ты тип объявил? И VarZap - это одно слово, без пробела.
Консоль, по моему, отличается от оконного приложения только тем, что у неё нет графического окна. Соответственно ввод/вывод только текстовый. Впрочем, в этой теории я сам не силён. Delphi изучал самостоятельно.
Пока писал пост, увидел, что ты уже разобрался. Но на будущее - сразу пиши, что за ошибка. О другом сейчас в личку напишу.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
07.06.2012, 23:55  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
Насчёт ошибки. Сразу пиши, что за ошибка. И ты тип объявил? И VarZap - это одно слово, без пробела.
Консоль, по моему, отличается от оконного приложения только тем, что у неё нет графического окна. Соответственно ввод/вывод только текстовый. Впрочем, в этой теории я сам не силён. Delphi изучал самостоятельно.
Пока писал пост, увидел, что ты уже разобрался. Но на будущее - сразу пиши, что за ошибка. О другом сейчас в личку напишу.
Хорошо. Просто в типе забыл прописать.
Кстати я тоже самоучка. Раньше (когда был zx Spektrum), изучал бейсик.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
09.06.2012, 21:04  [ТС]
С директориями какая то прям беда
Вот нашел подробно 'Пример кода.'
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var
  dirName : String;
 
begin
  // Создание нового каталога
  dirName := 'Test Folder';
  CreateDir(dirName);
 
  // Теперь проверяем существует ли каталог
  if DirectoryExists(dirName)
  then ShowMessage(dirName+' существует')
  else ShowMessage(dirName+' не существует');
 
  // Удаление каталога и просмотр снова
  RemoveDir(dirName);
  if DirectoryExists(dirName)
  then ShowMessage(dirName+' всё ещё существует!')
  else ShowMessage(dirName+' больше не существует');
end;
У себя делаю так:
Описание Savedialog1 кнопки:
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button3Click(Sender: TObject);
var
path_dir: string;
begin
if SelectDirectory('выбор ','C:\', path_dir) then
Edit3.Text:= (path_dir);
 
end;
Сам процесс
Delphi
1
2
3
4
5
6
7
8
9
10
var
  Patch_dir : String;
 
begin
  // Теперь проверяем существует ли каталог
  if DirectoryExists(Patch_dir)
  then ShowMessage(Patch_dir+' существует')
  else ShowMessage(Patch_dir+' не существует');
exit;
end;
Если я не создаю дириктрию, то программа пишет не существует
После нажатия OK продолжает работу. И выпадает при первом обращении к не существующей директории?
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
09.06.2012, 21:20
Так сразу проверяй, спрашивай - "Создать?" и создавай:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button3Click(Sender: TObject);
var
path_dir: string;
begin
  if SelectDirectory('выбор ','C:\', path_dir) then
  Edit3.Text:= (path_dir);
 
  // Теперь проверяем существует ли каталог
  if DirectoryExists(dirName) Then
  //Не существует...
  If MessageDlg('Такая папка не существует!'+#13+#10+'Создать?',mtWarning,mbOKCancel,0)=mbOK Then
  CreateDir(dirName) Else
  Edit3.Text:=''; //Если отказались - пустая строка
  //Дальше при запуске распаковки проверять если Edit3.Text='' - сразу выходить без обработки
end;

Не по теме:

Ты уже приехал?

0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
09.06.2012, 23:16  [ТС]

Не по теме:

Ты уже приехал?


Не по теме:

Я завтра в 20:00 только уезжаю:)



Добавлено через 1 час 42 минуты
Delphi
1
If MessageDlg('Такая папка не существует!'+#13+#10+'Создать?',mtWarning,mbOKCancel,0)=mbOK Then
Строка 11
Ошибка [Error] Unit1.pas(62): Incompatible types
Кстати, сейчас порылся по интернету, не каких похожих объяснений не встретил. Скорей всего надо искать ответ в исходниках.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
09.06.2012, 23:18
Насчёт Busy.
Там эта переменная устанавливается в True в начале разрезания. Надпись на кнопке - становится "остановить". При повторном щелчке по этой же кнопке в коде вначале проверяется, если Busy равен True - тогда он устанавливается в False и выход. При этом произойдёт возврат к выполнению разрезания. Т.е. при нажатии кнопки выполнение какого-либо кода прерывается обрабатывается событие Click кнопки, а потом происходит возврат к выполнению предыдущего кода. В цикле разрезания стоит выход из цикла, если Busy становится равным False. А он станет таким после повторного щелчка на кнопке. Произойдёт выход из цикла и завершение разрезания. При нормальном завершении разрезания тоже Busy устанавливается равным False и восстанавливается надпись на кнопке.
Абсолютно то же самое можно сделать и для склеивания.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2012, 23:18

Псевдо-вирус (Delphi глазами хакера )
Кому будет интересно &quot;поприкалываться&quot; или посмотреть как сделана подобная штука. Итак, при запуске файла появляется некоторое (конечное)...

Можно ли загружать файлы из архивов?
Вот возникло у меня несколько вопросов: 1) Можно ли загружать файлы из архивов??? Чтобы картинки проги хранить не в папке, а в архиве...

Нужен компонент для создания архивов
Привет всем! В общем цель задачи такова: необходимо написать прогу, которая будет по расписанию архивировать выбранную папку (именно...

Помогите понять формат игровых архивов и карт
Здравствуйте! Я занимаюсь написанием конвертера карт из формата игры Doom 2D Forever в формат карт Doom 2D Multiplayer. Проблема вот в...

Bash-распаковщик архивов
Доброго времени суток! Есть такое задание: 1) Поднять ftp. 2) Распаковать все архивы форматов *.zip, *.rar в папках и подпапках, затем...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru