Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.84
Melko
4 / 4 / 1
Регистрация: 07.01.2012
Сообщений: 243
#1

Дополнительный поток: как реализовать - Delphi

05.04.2012, 19:17. Просмотров 6566. Ответов 131
Метки нет (Все метки)

Добрый день! Помогите пожалуйста добавить поток в программу, просто не могу сам разобраться в потоках.
И ещё не большая просьба - дайте какой ни будь очень простой пример потоков. Вся литература, посвящённая этой теме, уж больно не понятная
Заранее спасибо!
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
unit deleter;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Button2: TButton;
    N5: TMenuItem;
    N6: TMenuItem;
    Button3: TButton;
    CheckBox1: TCheckBox;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
f, j:integer;
begin
for i:=0 to memo1.Lines.Count -1 do
begin
repeat
if ansipos(memo2.Text,memo1.Lines[i])<>0 then
memo1.Lines.Delete(i);
until
ansipos(memo2.Text,memo1.Lines[i])=0;
if checkbox1.Checked then
begin
For f:=Memo1.Lines.Count-1 downto 0 do
For j:=f-1 downto 0 do
If Memo1.Lines[f]=Memo1.Lines[j] then
Memo1.Lines.Delete(f);
end;
end;
end;
 
procedure TForm1.N6Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to memo1.Lines.Count -1 do
begin
repeat
if ansipos(memo2.Text,memo1.Lines[i])<>0 then
memo1.Lines.Delete(i);
until
ansipos(memo2.Text,memo1.Lines[i])=0;
if ansipos(memo2.Text,memo1.Lines[i])=0 then
showmessage('Готово!');
end;
end;
 
procedure TForm1.N2Click(Sender: TObject);
begin
if opendialog1.execute=true then
memo1.Lines.LoadFromFile(opendialog1.FileName);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
i, j:integer;
begin
For i:=Memo1.Lines.Count-1 downto 0 do
For j:=i-1 downto 0 do
If Memo1.Lines[i]=Memo1.Lines[j] then
Memo1.Lines.Delete(i);
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
if savedialog1.execute=true then
memo1.Lines.SaveToFile(savedialog1.Filename);
end;
 
procedure TForm1.N5Click(Sender: TObject);
begin
if savedialog1.execute=true then
memo1.Lines.SaveToFile(savedialog1.Filename);
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;
memo2.Clear;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
if opendialog1.execute=true then
memo1.Lines.LoadFromFile(opendialog1.FileName);
end;
 
procedure TForm1.N3Click(Sender: TObject);
begin
form1.Close;
end;
 
procedure TForm1.N4Click(Sender: TObject);
begin
MessageDlg('Прогу заебенил Kloud :D', mtinformation, [mbOk], 0);
 
end;
 
end.
Добавлено через 1 час 39 минут
Помогите кто нибудь
Уж очень хочется с потоками разобраться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2012, 19:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Дополнительный поток: как реализовать (Delphi):

Дополнительный поток и внешние функции\процедуры - Delphi
Приветствую Вас, победители восставших компиляторов. Возник небольшой вопрос, в проге есть вспомогательные модули, ну и соответственно...

Поток освобождается, но переменная, которой был присвоен этот поток, не очищается - Delphi
Мне интересно, вот поток отработал, стоит FreeOnTerminate:=True; Поток освобождается, но переменной которой было присвоен этот поток, не...

Как уничтожить поток? - Delphi
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Threads.MyThreads.Free;//Не канает. пишит _...

Как приостановить поток? - Delphi
var I: Integer; begin Thread := sSpinEdit2.Value; for I := 0 to Thread do begin MyThr.Suspend; end;

Как остановить поток - Delphi
Здравствуйте, у меня в потоке выполняется код, а именно запрос idhttp1.get после запроса и обработки данных я в этом же потоке делаю...

Как запустить поток из таймера? - Delphi
не получается запустить потоки из таймера, при создании потока из кнопки все работает procedure TForm1.Button2Click(Sender: TObject); ...

131
Melko
4 / 4 / 1
Регистрация: 07.01.2012
Сообщений: 243
08.04.2012, 16:52  [ТС] #31
Теперь я вроди бы начал догонять по тихоньку
Осталось дело за малым - сделать поток в своей программе
Вот я тут начал делать, но потом понял, что всё, что я тут понаписал - полнейшая чушь. Не мог бы тоже глянуть? Хотя бы наводку дать, что куда вставлять, а то я не разберу, что запихнуть в
Delphi
1
procedure potok.loading;
то ли весь код, а синхронизировать в execute, то ли части кода
0
Вложения
Тип файла: rar 11.rar (2.9 Кб, 2 просмотров)
Одиночка
3933 / 1858 / 89
Регистрация: 16.03.2012
Сообщений: 3,869
08.04.2012, 19:08 #32
Нет файла deleter.pas.

Добавлено через 12 минут
Вот код потока:
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
unit Unit1;
 
interface
 
uses
  Classes, SysUtils;
 
type
  potok = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure loading;
  end;
Tpotok:potok;
m,n,b:word;
implementation
//uses unit1;
 
{ potok }
 
procedure potok.loading;
var
  i:integer;
  f,j:integer;
begin
  for i:=0 to memo1.Lines.Count-1 do
  begin
    m:=i;
    repeat
      if ansipos(memo2.Text,memo1.Lines[i])<>0 then
      memo1.Lines.Delete(m);
    until ansipos(memo2.Text,memo1.Lines[i])=0;
    if checkbox1.Checked then
    begin
      n:=f;
      b:=j;
      For f:=Memo1.Lines.Count-1 downto 0 do
      For j:=f-1 downto 0 do
      If Memo1.Lines[f]=Memo1.Lines[j] then
      Memo1.Lines.Delete(n);
    end;
  end;
end;
 
procedure potok.Execute;
begin
  synchronize(loading);
end;
 
end.
Я в подробности не вдавался. Но теперь же нужно в Create основной формы сделать создание и запуск потока. Кстати: там в uses была ссылка на самого себя. Наверное там нужно сделать ссылку на этот deleter.
1
Melko
4 / 4 / 1
Регистрация: 07.01.2012
Сообщений: 243
11.04.2012, 15:15  [ТС] #33
Так как у меня не получается ничего, я решил подойти с другой стороны - я из оной сделаю несколько программ(код для меня пока что очень грамоздкий и трудно в нем копаться)
Но тут снова закралась ошибка...
з.ы: проверьте код пожалуйста!
код Unit1
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, unit2;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
potok.create(true);
potok.resume;
end;
 
end.

код Unit2
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
unit Unit2;
 
interface
 
uses
  Classes, SysUtils;
 
type
  potok = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure loading;
  end;
 
  Tpotok:potok;
 
implementation
uses Unit1;
{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,
 
      Synchronize(UpdateCaption);
 
  and UpdateCaption could look like,
 
    procedure potok.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }
 
{ potok }
 
procedure potok.loading;
var
i, j:integer;
begin
For i:=Memo1.Lines.Count-1 downto 0 do
For j:=i-1 downto 0 do
If Memo1.Lines[i]=Memo1.Lines[j] then
Memo1.Lines.Delete(i);
 
procedure potok.Execute;
begin
  synchronize(loading);
end;
end;
end.
0
Миниатюры
Дополнительный поток: как реализовать  
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
11.04.2012, 17:04 #34
Melko, вам же компилятор говорит
17: Tpotok = potok;
а переменная TPotok класса potok это вообще рукалицо (почитайте соглашения об обозначениях переменных и классов).
0
Одиночка
3933 / 1858 / 89
Регистрация: 16.03.2012
Сообщений: 3,869
11.04.2012, 18:41 #35
Psilon: Ну написал человек наоборот, я не стал менять, чтобы не запутывать его ещё больше.

Это так должен быть написан Unit1:
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, unit2;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin                  //было пробущено начало блока
   tpotok:=potok.Create(TRUE); //Создаём переменную tpotok типа potok
   tpotok.Priority:=TpLowest;    //Устанавливаем приоритет потока
   tpotok.resume;                   //Запускаем поток
//  potok.create(true); //Это неправильно
//  potok.resume;
end;
 
end.
А так должен быть написан Unit2:

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
unit Unit2;
 
interface
 
uses
  Classes, SysUtils;
 
type
  potok = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure loading;
  end;
 
  Tpotok:potok;
 
implementation
uses Unit1;
 
{ potok }
 
//Ошибка ................................
//Процедуры Loading и Execute - это два разных метода потока. Зачем ты их запихнул в Loading?
procedure potok.loading;
var
  i, j:integer;
begin
  For i:=Memo1.Lines.Count-1 downto 0 do
  For j:=i-1 downto 0 do
  If Memo1.Lines[i]=Memo1.Lines[j] then
  Memo1.Lines.Delete(i);
end;
 
procedure potok.Execute;
begin
  synchronize(loading);
end;
 
end.
0
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
11.04.2012, 18:50 #36
Одиночка, кстати, у меня компилятор ругается на resume (правда не еррор, а warning). И насчет потоков, лично я в своем проекте сделал так:
Delphi
1
abcdthread:=Tabcdthread.create(false);
А в описании самого потока
Delphi
1
2
3
4
5
procedure TAbcdthread.execute;
begin
abcdthread.Priority:=...
<...>
end;
0
Melko
4 / 4 / 1
Регистрация: 07.01.2012
Сообщений: 243
11.04.2012, 18:58  [ТС] #37
Цитата Сообщение от Psilon Посмотреть сообщение
Melko, вам же компилятор говорит

а переменная TPotok класса potok это вообще рукалицо (почитайте соглашения об обозначениях переменных и классов).
Так через ":" прописывается ведь.
0
Одиночка
3933 / 1858 / 89
Регистрация: 16.03.2012
Сообщений: 3,869
11.04.2012, 18:59 #38
Psilon: Можно и так. При создании потока - он сразу запускается. Опять же, я стараюсь как можно меньше отступать от исходных записей того, кому отвечаю, чтобы ещё больше не запутать. А насчёт potok Tpotok, с точки зрения соглашений - ты прав. Но это соглашения устные, и для компилятора, по-моему, всё равно.
0
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
11.04.2012, 18:59 #39
Melko, это объявление типа, а не объявление переменной. Для типов работают только присваивания, тип не может принадлежать к какому-то типу, он может в себя включать стандартные (или один стандартный). К тому же почитайте, что вам компилятор пишет и какие значки рисует.

Дело в том, что вы пишете в разделе типов и компилятор думает, что tpotok - это тип (Хотя и я бы так подумал )). А надо писать в разделе var. Если его нету, то надо его дописать (после объявлений всех типов).
Тогда можете с чистой совестью писать TPotok: potok; и ошибка исчезнет

Одиночка,
Я не спорю, не путаете - и хорошо Я просто высказался и, кажется, на эту тему не повторялся
Кстати плохо, что вы не заметили, что для переменной TPotok не написан раздел var
0
Одиночка
3933 / 1858 / 89
Регистрация: 16.03.2012
Сообщений: 3,869
11.04.2012, 19:01 #40
Psilon: Да там в коде других ошибок хватало.
1
Melko
4 / 4 / 1
Регистрация: 07.01.2012
Сообщений: 243
11.04.2012, 19:09  [ТС] #41
Цитата Сообщение от Одиночка Посмотреть сообщение
Psilon: Ну написал человек наоборот, я не стал менять, чтобы не запутывать его ещё больше.

Это так должен быть написан Unit1:
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, unit2;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin                  //было пробущено начало блока
   tpotok:=potok.Create(TRUE); //Создаём переменную tpotok типа potok
   tpotok.Priority:=TpLowest;    //Устанавливаем приоритет потока
   tpotok.resume;                   //Запускаем поток
//  potok.create(true); //Это неправильно
//  potok.resume;
end;
 
end.
А так должен быть написан Unit2:

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
unit Unit2;
 
interface
 
uses
  Classes, SysUtils;
 
type
  potok = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure loading;
  end;
 
  Tpotok:potok;
 
implementation
uses Unit1;
 
{ potok }
 
//Ошибка ................................
//Процедуры Loading и Execute - это два разных метода потока. Зачем ты их запихнул в Loading?
procedure potok.loading;
var
  i, j:integer;
begin
  For i:=Memo1.Lines.Count-1 downto 0 do
  For j:=i-1 downto 0 do
  If Memo1.Lines[i]=Memo1.Lines[j] then
  Memo1.Lines.Delete(i);
end;
 
procedure potok.Execute;
begin
  synchronize(loading);
end;
 
end.
Я, просто, что бы не переписывать код вручную, его скопировал, по этому и пропустил begin
А вот на счёт "зачем всё в один запихнул?" я не очень понял. Я делал по принципу execute - синхронизация, а loading - код

Добавлено через 3 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
Melko, это объявление типа, а не объявление переменной. Для типов работают только присваивания, тип не может принадлежать к какому-то типу, он может в себя включать стандартные (или один стандартный). К тому же почитайте, что вам компилятор пишет и какие значки рисует.
Я знаю, что он написал что то вроди "стоит ";" а ожидалось ":"", только вот когда менял - ни к чему хорошему это не привело

Добавлено через 3 минуты
Всё! Я понял из-за чего сыр бор
у меня после "implementation" не написан "var"
Ещё раз прошу прощения, просто делал наспех, а после правки забыл вставить немного исправленный код
0
Одиночка
3933 / 1858 / 89
Регистрация: 16.03.2012
Сообщений: 3,869
11.04.2012, 19:11 #42
Ну end, которое у меня стоит 34-й строкой, у тебя стояло после того, который у меня 39-й.

Да, а var я и не заметил.

Psilon: Насчёт того, что компилятор ругается на resume. Думаю в более продвинутых Дельфях компилятор уже видит, что поток сразу запускается после создания и считает, что это некорректный код. Хотя кто его знает.
0
Melko
4 / 4 / 1
Регистрация: 07.01.2012
Сообщений: 243
11.04.2012, 19:16  [ТС] #43
Теперь возникают другие ошибки
unit1
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, unit2;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
tpotok:=potok.Create(TRUE); //ÑîçäГ*ВёГ¬ ïåðåìåГ*Г*ГіГѕ tpotok ГІГЁГЇГ* potok
tpotok.Priority:=TpLowest;    //ÓñòГ*Г*Г*âëèâГ*ГҐГ¬ ïðèîðèòåò ïîòîêГ*
tpotok.resume;
end;
 
end.

unit2
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
unit Unit2;
 
interface
 
uses
  Classes, SysUtils;
 
type
  potok = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure loading;
  end;
   var
  Tpotok:potok;
 
implementation
uses Unit1;
{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,
 
      Synchronize(UpdateCaption);
 
  and UpdateCaption could look like,
 
    procedure potok.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }
 
{ potok }
 
procedure potok.loading;
var
i, j:integer;
begin
For i:=Memo1.Lines.Count-1 downto 0 do
For j:=i-1 downto 0 do
If Memo1.Lines[i]=Memo1.Lines[j] then
Memo1.Lines.Delete(i);
end;
procedure potok.Execute;
begin
  synchronize(loading);
end;
 
end.
0
Миниатюры
Дополнительный поток: как реализовать  
Одиночка
3933 / 1858 / 89
Регистрация: 16.03.2012
Сообщений: 3,869
11.04.2012, 19:20 #44
В Unit2 везде вместо Memo1 нужно писать: Form1.Memo1.
1
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
11.04.2012, 19:23 #45
Одиночка,
Цитата Сообщение от Rad Studio Delphi XE2
[DCC Warning] MergeSortUnit.pas(287): W1000 Symbol 'Resume' is deprecated
Try to avoid using Suspend and Resume in most circumstances. Suspending and resuming a thread using these two functions can result in undefined behavior and in deadlock situations that are hard to debug and fix later on. Proper thread synchronization techniques should be based on TEvent, TMutex, and critical sections.
1
11.04.2012, 19:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2012, 19:23
Привет! Вот еще темы с ответами:

Как в поток загрузить картинку из Интернета? - Delphi
Как в поток (TStream) загрузить картинку из Интернета?

Поток - Thread, как с ним работать - Delphi
Здравствуйте, Нужно создать (отдельный модуль) поток(с отображением Progressbar'ом) с одной функцией проверкой на существование файлов в...

Как определить закончил ли работу поток? - Delphi
Здравствуйте, как определить закончил ли работу поток? begin Potok1 := ParallelObj.Create(true); Potok2 :=...

Как лучше добавить процедуру в поток? - Delphi
Есть процедура, которая воспроизводит файл. В зависимости от checkbox'a на Form4, если он чекнут, то оно кеширует на диск, если он чекнут и...


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru