Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi 2

Автор: Dmitry
Дата сообщения: 11.10.2006 06:58
andead
если создавать поток классом, то можно создать его в остановленном состоянии, присвоить свойствам класса нужные значения, а потом запустить. если создавать через апи, то там можно дополнительный параметр передавать (pointer)
Автор: vserd
Дата сообщения: 11.10.2006 09:39
RomanTim

Цитата:
Я обычно просто процедурой CreateThread

Использование делфи для того, чтобы писать на голом АПИ - это все-таки на любителя

Ну как сказать, чтобы использовать в своем классе поток, совершенно не обязательно использовать TThread. Гораздо более выгодным представляется использование CreateThread и передавать ему метод класса в качестве потоковой функции :)).
Кроме того это сокращает объем кода.

andead

Цитата:
как передать потоку при создании некоторые значения?

Создать поток в приостановленном состоянии, присвоить нужные значения и запустить на выполнение. Глобальные переменные использовать не рекомендую, вопервых если по ошибке создашь второй поток, можешь получить массу не поняток, во вторых это источник массы не поняток в поведении программы, особенно когда переменные будут видимы вне модуля.
Автор: Nightcrawler
Дата сообщения: 11.10.2006 10:56
Подскажите, пожалуйста, как решить задачу?

Есть файл Excel с данными, необходимо из этого файла сделать кучу писем и положить в папку Drafts Аутлука.
Нашел инфу, как управлять Outlloоk'ом, но во всех примерах, следующее:
...
FLD := NS.GetDefaultFolder($00000010);
//создаем письмо
IM:=FLD.Items.Add($00000000);
IM.Recipients.Add('ya@mail.ru');
IM.Subject := 'Subject';

IM.Body := Ваш счет оплачен сегодня'+chr(13)+'С уважением, А.А.Иванов'

То есть в body обычный текст. Как можно в письмо содержимое буфера обмена засунуть или как получить содержимое буфера (скопированное из Excel) получить в виде HTML-строки?

Аттачи делать крайне не желательно, данные из Excel'я должны быть в теле письма табличкой
Автор: RomanTim
Дата сообщения: 11.10.2006 11:13
vserd

Цитата:
Ну как сказать, чтобы использовать в своем классе поток, совершенно не обязательно использовать TThread. Гораздо более выгодным представляется использование CreateThread и передавать ему метод класса в качестве потоковой функции ).
Кроме того это сокращает объем кода

А чем это так выгодно? На счет сокращения кода - не такая и большая экономия, а вот оформление потока в виде класса дает возможность завести у него собственные поля и методы - все таки алгоритм в виде одной процедуры становится нечитабельным уже при не самой большой сложности
Автор: xy
Дата сообщения: 11.10.2006 11:44
Вопросик по сборке ехе - можно ли как-то заставить Делфи как-то его сжимать, т.е. хочется, чтобы оно хотя бы сжимало или шифровало строковые константы :-?

Упаковщики использовать не хочется, а открытость всех строк в бинарнике сильно смущает :)
Автор: fatfaldog
Дата сообщения: 11.10.2006 13:07
Никто не знает в чём проблема?
При попытке использовать FloatToStr или StrToFloat компилятор выдаёт ошибку: undeclared identifier: FloatToStr;
Использую Борланд Делфи 8. На 6 и 7 вроде всё нормально работало... Или я после C++ что-то забыл....

Если кому нужно, то вот текст программы(вторая процедура снизу):
[more]unit Kalkul;

interface

uses
System.Drawing, System.Collections, System.ComponentModel,
System.Windows.Forms, System.Data;

type
TKalkul = class(System.Windows.Forms.Form)
{$REGION 'Designer Managed Code'}
strict private
/// <summary>
/// Required designer variable.
/// </summary>
Components: System.ComponentModel.Container;
chislo1: System.Windows.Forms.TextBox;
chislo2: System.Windows.Forms.TextBox;
RadioButton1: System.Windows.Forms.RadioButton;
RadioButton2: System.Windows.Forms.RadioButton;
resbox: System.Windows.Forms.RichTextBox;
Button1: System.Windows.Forms.Button;
Button2: System.Windows.Forms.Button;
Button3: System.Windows.Forms.Button;
Button4: System.Windows.Forms.Button;
Button5: System.Windows.Forms.Button;
CheckBox1: System.Windows.Forms.CheckBox;
Button9: System.Windows.Forms.Button;
Button7: System.Windows.Forms.Button;
Button10: System.Windows.Forms.Button;
Button11: System.Windows.Forms.Button;
Button12: System.Windows.Forms.Button;
Button8: System.Windows.Forms.Button;
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
procedure InitializeComponent;
procedure kalkprost;
procedure Button1_Click(sender: System.Object; e: System.EventArgs);
{$ENDREGION}

strict protected
/// <summary>
/// Clean up any resources being used.
/// </summary>
procedure Dispose(Disposing: Boolean); override;

private

{ Private Declarations }
public

constructor Create;

end;

[assembly: RuntimeRequiredAttribute(TypeOf(TKalkul))]
var

a:real;
dei: char;


implementation

{$REGION 'Windows Form Designer generated code'}
/// <summary>
/// Required method for Designer support -- do not modify
/// the contents of this method with the code editor.
/// </summary>

procedure TKalkul.InitializeComponent;
begin
Self.chislo1 := System.Windows.Forms.TextBox.Create;
Self.chislo2 := System.Windows.Forms.TextBox.Create;
Self.RadioButton1 := System.Windows.Forms.RadioButton.Create;
Self.RadioButton2 := System.Windows.Forms.RadioButton.Create;
Self.resbox := System.Windows.Forms.RichTextBox.Create;
Self.Button1 := System.Windows.Forms.Button.Create;
Self.Button2 := System.Windows.Forms.Button.Create;
Self.Button3 := System.Windows.Forms.Button.Create;
Self.Button4 := System.Windows.Forms.Button.Create;
Self.Button5 := System.Windows.Forms.Button.Create;
Self.CheckBox1 := System.Windows.Forms.CheckBox.Create;
Self.Button9 := System.Windows.Forms.Button.Create;
Self.Button7 := System.Windows.Forms.Button.Create;
Self.Button10 := System.Windows.Forms.Button.Create;
Self.Button11 := System.Windows.Forms.Button.Create;
Self.Button12 := System.Windows.Forms.Button.Create;
Self.Button8 := System.Windows.Forms.Button.Create;
Self.SuspendLayout;
//
// chislo1
//
Self.chislo1.Location := System.Drawing.Point.Create(40, 32);
Self.chislo1.Name := 'chislo1';
Self.chislo1.Size := System.Drawing.Size.Create(88, 20);
Self.chislo1.TabIndex := 0;
Self.chislo1.Text := '';
//
// chislo2
//
Self.chislo2.Location := System.Drawing.Point.Create(40, 72);
Self.chislo2.Name := 'chislo2';
Self.chislo2.Size := System.Drawing.Size.Create(88, 20);
Self.chislo2.TabIndex := 1;
Self.chislo2.Text := '';
//
// RadioButton1
//
Self.RadioButton1.Checked := True;
Self.RadioButton1.Location := System.Drawing.Point.Create(140, 35);
Self.RadioButton1.Name := 'RadioButton1';
Self.RadioButton1.Size := System.Drawing.Size.Create(16, 16);
Self.RadioButton1.TabIndex := 2;
Self.RadioButton1.TabStop := True;
Self.RadioButton1.Text := 'RadioButton1';
//
// RadioButton2
//
Self.RadioButton2.Location := System.Drawing.Point.Create(140, 73);
Self.RadioButton2.Name := 'RadioButton2';
Self.RadioButton2.Size := System.Drawing.Size.Create(16, 16);
Self.RadioButton2.TabIndex := 3;
Self.RadioButton2.Text := 'RadioButton2';
//
// resbox
//
Self.resbox.Location := System.Drawing.Point.Create(232, 24);
Self.resbox.Name := 'resbox';
Self.resbox.Size := System.Drawing.Size.Create(104, 72);
Self.resbox.TabIndex := 4;
Self.resbox.Text := 'RichTextBox1';
//
// Button1
//
Self.Button1.Location := System.Drawing.Point.Create(160, 32);
Self.Button1.Name := 'Button1';
Self.Button1.Size := System.Drawing.Size.Create(24, 24);
Self.Button1.TabIndex := 5;
Self.Button1.Text := '+';
Include(Self.Button1.Click, Self.Button1_Click);
//
// Button2
//
Self.Button2.Location := System.Drawing.Point.Create(160, 71);
Self.Button2.Name := 'Button2';
Self.Button2.Size := System.Drawing.Size.Create(24, 24);
Self.Button2.TabIndex := 6;
Self.Button2.Text := 'X';
//
// Button3
//
Self.Button3.Location := System.Drawing.Point.Create(232, 112);
Self.Button3.Name := 'Button3';
Self.Button3.Size := System.Drawing.Size.Create(104, 24);
Self.Button3.TabIndex := 7;
Self.Button3.Text := 'сброс';
//
// Button4
//
Self.Button4.Location := System.Drawing.Point.Create(192, 72);
Self.Button4.Name := 'Button4';
Self.Button4.Size := System.Drawing.Size.Create(24, 24);
Self.Button4.TabIndex := 8;
Self.Button4.Text := '/';
//
// Button5
//
Self.Button5.Location := System.Drawing.Point.Create(192, 32);
Self.Button5.Name := 'Button5';
Self.Button5.Size := System.Drawing.Size.Create(24, 24);
Self.Button5.TabIndex := 9;
Self.Button5.Text := '-';
//
// CheckBox1
//
Self.CheckBox1.Location := System.Drawing.Point.Create(32, 120);
Self.CheckBox1.Name := 'CheckBox1';
Self.CheckBox1.Size := System.Drawing.Size.Create(168, 16);
Self.CheckBox1.TabIndex := 10;
Self.CheckBox1.Text := 'дополнительные функции';
//
// Button9
//
Self.Button9.Location := System.Drawing.Point.Create(24, 144);
Self.Button9.Name := 'Button9';
Self.Button9.Size := System.Drawing.Size.Create(48, 24);
Self.Button9.TabIndex := 14;
Self.Button9.Text := 'sin';
//
// Button7
//
Self.Button7.Location := System.Drawing.Point.Create(88, 144);
Self.Button7.Name := 'Button7';
Self.Button7.Size := System.Drawing.Size.Create(48, 24);
Self.Button7.TabIndex := 15;
Self.Button7.Text := 'cos';
//
// Button10
//
Self.Button10.Location := System.Drawing.Point.Create(24, 176);
Self.Button10.Name := 'Button10';
Self.Button10.Size := System.Drawing.Size.Create(48, 24);
Self.Button10.TabIndex := 17;
Self.Button10.Text := 'sqrt';
//
// Button11
//
Self.Button11.Location := System.Drawing.Point.Create(88, 176);
Self.Button11.Name := 'Button11';
Self.Button11.Size := System.Drawing.Size.Create(48, 24);
Self.Button11.TabIndex := 18;
Self.Button11.Text := 'lg';
//
// Button12
//
Self.Button12.Location := System.Drawing.Point.Create(152, 176);
Self.Button12.Name := 'Button12';
Self.Button12.Size := System.Drawing.Size.Create(48, 24);
Self.Button12.TabIndex := 19;
Self.Button12.Text := 'x^y';
//
// Button8
//
Self.Button8.Location := System.Drawing.Point.Create(152, 144);
Self.Button8.Name := 'Button8';
Self.Button8.Size := System.Drawing.Size.Create(48, 24);
Self.Button8.TabIndex := 20;
Self.Button8.Text := 'tg';
//
// TKalkul
//
Self.AutoScaleBaseSize := System.Drawing.Size.Create(5, 13);
Self.ClientSize := System.Drawing.Size.Create(392, 230);
Self.Controls.Add(Self.Button8);
Self.Controls.Add(Self.Button12);
Self.Controls.Add(Self.Button11);
Self.Controls.Add(Self.Button10);
Self.Controls.Add(Self.Button7);
Self.Controls.Add(Self.Button9);
Self.Controls.Add(Self.CheckBox1);
Self.Controls.Add(Self.Button5);
Self.Controls.Add(Self.Button4);
Self.Controls.Add(Self.Button3);
Self.Controls.Add(Self.Button2);
Self.Controls.Add(Self.Button1);
Self.Controls.Add(Self.resbox);
Self.Controls.Add(Self.RadioButton2);
Self.Controls.Add(Self.RadioButton1);
Self.Controls.Add(Self.chislo2);
Self.Controls.Add(Self.chislo1);
Self.Name := 'TKalkul';
Self.Text := 'WinForm';
Self.ResumeLayout(False);
end;
{$ENDREGION}

procedure TKalkul.Dispose(Disposing: Boolean);
begin
if Disposing then
begin
if Components <> nil then
Components.Dispose();
end;
inherited Dispose(Disposing);
end;

constructor TKalkul.Create;
begin
inherited Create;
//
// Required for Windows Form Designer support
//
InitializeComponent;
//
// TODO: Add any constructor code after InitializeComponent call
//
end;


procedure TKalkul.kalkprost;
begin
resbox.Clear;
resbox.AppendText(chislo1.Text+dei+chislo2.Text+'=');
a:=strtofloat(chislo1.Text);
end;


procedure TKalkul.Button1_Click(sender: System.Object; e: System.EventArgs);
begin
dei:='+';
kalkprost;
end;


end.
[/more]
Автор: OdesitVadim
Дата сообщения: 11.10.2006 13:16
fatfaldog
Delphi 8 - это .NET, поэтому нужно играть по эго правилам.
FloatToStr(q), где q типа float перейдёт в q.ToString
А назад кажеться так Convert.ParseFloat(s);
Автор: JbBaD
Дата сообщения: 11.10.2006 13:22
А не подскажите как попроще заполнить дерево из путей?

Тоесть скажем вот это:

\MainDir\SubDir1
\MainDir\SubDir2\Temp\

превратить вот в это:

MainDir
SubDir1
SubDir2
Temp
Автор: fatfaldog
Дата сообщения: 11.10.2006 13:28
2 OdesitVadim
Попытка вписать
a:=chislo1.Text;
strtofloat(a);
предварительно поменяв тип переменной а на string не привела к каким либо видимым изменениям. Выдаёт тоже самое.

Если что, то в справке написано(правда я мало что понял из этого):
[more]FloatToStr
Converts a floating point value to a string.

Namespace
Borland.Vcl.SysUtils
Syntax

function FloatToStr(Value: Extended): string;


function FloatToStr(Value: Extended, const FormatSettings: TFormatSettings): string;


function FloatToStr(Value: Extended, Provider: IFormatProvider): string;


Description
FloatToStr converts the floating-point value given by Value to its string representation. The conversion uses general number format with 15 significant digits.

For greater control over the formatting of the string, use the FloatToStrF function.

The first form of FloatToStr is not thread-safe, because it uses localization information contained in global variables. The second form of FloatToStr, which is thread-safe, refers to localization information contained in the FormatSettings parameter. Before calling the thread-safe form of FloatToStr, you must populate FormatSettings with localization information. To populate FormatSettings with a set of default locale values, call GetLocaleFormatSettings.[/more]
Автор: Jokerjar
Дата сообщения: 11.10.2006 13:28
xy, на счет делфи незнаю, а самому можно.

Простейший алгоритм шифрования строки:

Function Decode(S: String; Code: Integer): String;
Var t: Integer;
Begin
For t:=1 to Length(S) Do S[t]:=Chr(Ord(S[t]) xor Code);
Result:=S;
End;

Расшифровывать этой же.
Автор: fatfaldog
Дата сообщения: 11.10.2006 13:41
Спасибо всем кто пытался(и не пытался) помочь мне.
Я сам нашёл в чём ошибка. Как всегда в моей тупости.
Нужно было в uses дописать Borland.Vcl.SysUtils
и всё заработало как и должно.
(В принципе я подозревал, что в uses чего-то не хватает, но догадался что ИМЕННО туда вписывать лишь при пощении здесь справки , т.к. в справке нужное стоит ссылочкой, а здесь текстом, а ссылочку копирнуть у меня ума не хватило Я как-то не заострял на ней внимание. В общем невнимательность и ничего более)
Ну и само собой разумеется, что поле объекта(как впрочем и любое выражение) нельзя использовать как параметр для StrToFloat. Им должна быть переменная типа string.

Прошу прощения если отнял у кого-либо лишнее время и трафик.
Автор: andead
Дата сообщения: 11.10.2006 18:19
RomanTim
Dmitry
vserd
СПАСИБ! переписал Create у потока, всё получилось..
Автор: xy
Дата сообщения: 11.10.2006 21:07
Jokerjar
ну это слишком геморно и не быстро :)
хотя вроде проблема надуманная, ведь если есть стандартный (с пом. Делфи) алгоритм упаковки строк, то найдется и стандартный алгоритм их распаковки :) не тут копать надо видимо
Автор: RayZ
Дата сообщения: 11.10.2006 22:25
Товарисчи, подскажите простейший способ создания одного уникального (без повторяющихся значений) списка TStringList из двух существующих?
Автор: xitsmex
Дата сообщения: 11.10.2006 22:59
RayZ
У нового duplicates := dupIgnore. Assign к одному из старых, затем Append в цикле ко второму...
Автор: Shweper
Дата сообщения: 12.10.2006 02:33
Я опять со своим Flash Создал я объект TShockwaveFlash, куда грузится мультик. Сделал ему канву и на этой канве нарисовал нечто. Оно нарисовалось, но когда на флэшке происходит движение, та часть канвы которую оно затрагивает- стирается. Соответственно мне бы надо после каждой смены кадра перерисовывать канву, а вот как можно узнать что эта самая смена произошла? Попробовал перерисовывать по таймеру установленному на 1, но получается периодическое мерцание и сильно грузится процессор, так что это не выход. И второе. Как узнать что по флэшке кликнули? События Онклик у нее нету.
Автор: RedPromo
Дата сообщения: 12.10.2006 10:21
xy
Вобще мне кажется запаковать exe средствами линковщика Делфи не получится, а вот использовать компоненту типа IonWorx SecureCode можно. И не нужно внешний пакер.
Автор: xy
Дата сообщения: 12.10.2006 10:29
RedPromo
спасибо, буду пробовать
Автор: RedPromo
Дата сообщения: 12.10.2006 10:34
У меня такой глюк пошел в BDS2006 в дебагере при наведении курсора на переменную типа матрица выводит HINT с данными матрицы и закрывается IDE и не спаршивает как зовут да еще так быстро что обалдеть можно (лучше бы она так запускалась), может кто знает что за глюк такой.
Автор: RomanTim
Дата сообщения: 12.10.2006 12:15
RedPromo
Все обновления стоят?
С массивами вроде не глючила, а вот на попытке посмотреть значение стрингового поля какого-нибудь класса периодически виснет.
Попробуй поискать на qc.borland.com, хотя там полазить - совсем расстроишься - некоторые критические дефекты, на которые все жалуются висят годами
Автор: vserd
Дата сообщения: 12.10.2006 14:46
RomanTim

Цитата:
А чем это так выгодно? На счет сокращения кода - не такая и большая экономия, а вот оформление потока в виде класса дает возможность завести у него собственные поля и методы - все таки алгоритм в виде одной процедуры становится нечитабельным уже при не самой большой сложности


Ключевой фразой в моем посте является передавать ему метод класса в качестве потоковой функции
Именно метод класса. А не отдельную процедуру. С доступом из этой потоковой функции ко всем внутренностям класса. Я, когда промучавшись до этого с TThread, открыл для себя что можно использовать метод класса для передачи в функции WinAPI, переписал свой модуль,то получил сокращение кода где-то раза в полтора.
Автор: RedPromo
Дата сообщения: 12.10.2006 16:07
RomanTim
Вобще все стоит включая 6hotfix значит возможно еще один баг появился.
Да в общем как мне то лучше бы небыло таких глючных Hint-ов.
Автор: TeXpert
Дата сообщения: 12.10.2006 16:49
Господа, помнится, было нечто вроде свойства у компоненты, которое определяет порядок её создания форме. Не напомните?
Автор: RedPromo
Дата сообщения: 12.10.2006 17:03
TeXpert
Если BDS2006 то меню Edit/Creation Order но только для невизуальных компонентов.
Автор: webgirlhb
Дата сообщения: 12.10.2006 17:08
Здравствуйте. Помогите, пожалуйста! Ситуация такая.
К примеру, есть переключатель "Вынесено постановление о назначении дела к слушанию", если он установлен, то панель со информацией об этом постановлении (дата, содержание и проч.) доступна для редактирования.
DBcheckBox имеет свойство EnableComponent: TControl, которое указывает на панель, содержащую информацию

procedure TfmDoc.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to fmDoc.ComponentCount-1 do
begin
if fmDoc.Components[i].ClassName = 'TRzDBCHECKBoxEnable' then
begin
if TRzDBCHECKBoxEnable(fmDoc.Components[i]).Checked = false then
if TRzDBCHECKBoxEnable(fmDoc.Components[i]).EnableComponent <> nil then
TRzDBCHECKBoxEnable(fmDoc.Components[i]).EnableComponent.Enabled := false;
end;
end;
end;

вроде ничего сложного, на создание просматриваются все компоненты, и если они относятся к определенному классу, то компонент, на который ссылается свойство EnableComponent дизаблится. (property EnableComponent: TControl, TRzDBCHECKBoxEnable - компонент, наследник DBCheckBox)

проблема в том, что при создании формы выскакивает ошибка Access Violation, причем не всегда, а только иногда , при отладке по шагам вообще все делается как надо, без ошибок (тоже иногда)

эта ошибка выскакивает обычно при создании первой формы. при создании последующих может не вылезти, однако код просто пропускается. во время отладки свойство Controls[i].ClassName и прочие свойства Controls[i] недоступны (inacessible value), соответственно, оператор if не выполняется, ошибка не выскакивает и полезности тоже никакой
Автор: Arvur
Дата сообщения: 12.10.2006 17:24
webgirlhb

Цитата:
if fmDoc.Components[i].ClassName = 'TRzDBCHECKBoxEnable' then

Помнится, ClassName к употреблению не рекомендован.
Я подобные конструкции обычно пишу в виде

Код:
if (fmDoc.Components[i] is TRzDBCHECKBoxEnable) then
with (fmDoc.Components[i] as TRzDBCHECKBoxEnable) do
Автор: webgirlhb
Дата сообщения: 12.10.2006 17:37
спасибо за ответ. хотя он и не помог, переписала код по вышеприведенной рекомендации, однако ошибка выходит та же самая

procedure TfmDoc.FormActivate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to fmDoc.ComponentCount-1 do
begin
if fmDoc.Components[i] is TRzDBCHECKBoxEnable then
begin
if (fmDoc.Components[i] as TRzDBCHECKBoxEnable).Checked = false then
if (fmDoc.Components[i] as TRzDBCHECKBoxEnable).EnableComponent <> nil then
(fmDoc.Components[i] as TRzDBCHECKBoxEnable).EnableComponent.Enabled := false;
end;
end;
end;
Автор: RayZ
Дата сообщения: 12.10.2006 18:48
webgirlhb, не пробовал повесить сие не на FormCreate, а на что нибуть что происходит попозже чуть, чам создание формы?
Автор: webgirlhb
Дата сообщения: 12.10.2006 18:52
пробовала. на activate. то же самое
Автор: RomanTim
Дата сообщения: 12.10.2006 19:12
vserd

Цитата:
Ключевой фразой в моем посте является передавать ему метод класса в качестве потоковой функции
Именно метод класса. А не отдельную процедуру. С доступом из этой потоковой функции ко всем внутренностям класса

А какие это все внутренностям класса, к которым может обратится метод класса? Опять же только переменные класса и свойства класса - они существуют в единственном экземпляре и существенно ничем не отличаются от переменных модуля (если не брать вопросы наследования таких классов - сомневаюсь что много людей пишет такие иерархии где активно используются методы класса). Личных же данных потока как не было так и нет.

К тому же уйдя от TTread при работе из дочернего потока с визуальными компонентами сразу приходишь к необходимости самостоятельно реализовывать Synchronize - не смертельно конечно, но зачем?

webgirlhb
Попробуй более точно определить где выскакивает AccessViolation - по адресу инструкции его вызвавшей. В каком модуле это происходит можно узнать в окне Modules. Если в твоем экзешнике - можно искать где именно, для этого надо приостановить программу, вызвать окно CPU и перейти на адрес. Там на набор ассемблерных инструкций указывается соответствующая строчка исходника (если будет сплошной код - откомпили с отладочными DCU)

Ну или в качестве альтернативы можно поставить ту же EurekaLog - и там посмотреть где был эксепшн и стек вызовов

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.