Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертация строк 
:(
    Опции темы
CodeMonkey
Дата 11.5.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Items 
это свойство Items объекта TTestObjectCollection. TTestObjectCollection - это контейнер из TTestObject. 

Items = 
"свойство равно"

Items = <>
"свойство равно пустому набору объектов"

Items = < объекты >
"свойство равно набору объектов"

Что тут необычного? Вот, вполне стандартный пример:
Код
  object HeaderControl1: THeaderControl
    Left = 0
    Top = 0
    Width = 552
    Height = 17
    Sections = <
      item
        ImageIndex = -1
        Text = '123'
        Width = 50
      end
      item
        ImageIndex = -1
        Text = '321'
        Width = 50
      end
      item
        ImageIndex = -1
        Text = '111'
        Width = 50
      end>
    ExplicitLeft = 200
    ExplicitTop = 312
    ExplicitWidth = 0
  end


Набор объектов - это коллекция. Используется для сохранения набора объеков, которые не являются компонентами.

Добавлено через 3 минуты и 50 секунд
Имеется в виду, что когда у тебя в контейнере - компоненты, то они сохраняются так:
Код
    object CategoryPanel1: TCategoryPanel
      Top = 0
      Caption = 'CategoryPanel1'
      TabOrder = 1
      object ProgressBar1: TProgressBar
        Left = 40
        Top = 56
        Width = 150
        Height = 21
        TabOrder = 0
      end
      object TrackBar1: TTrackBar
        Left = 40
        Top = 88
        Width = 150
        Height = 45
        TabOrder = 1
      end
    end

Но этот синтаксис не может быть использован для сохранения не компонентов - потому что у них нет Name. Поэтому используется другой синтаксис.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



CodeMonkey

У Вас ангельское терпение. Спасибо.

Я первый раз с таким синтаксисом встретился.  стало быть

<> между  тегами набор объектов?


Сижу в демке, но 90 процентов кода не понимаю.



--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  11.5.2011,  16:29 Найти цитируемый пост)
У Вас ангельское терпение. Спасибо.


Я не просто так это делаю, а с корыстной целью smile

По итогам я собираюсь написать очередную статью, где рассказать про сохранение/загрузку данных в файлы и потоки. И ответить на возникающие вопросы.


Цитата(PsiMagistr @  11.5.2011,  16:29 Найти цитируемый пост)
стало быть

<> между  тегами набор объектов?


Да. Каждый элемент заключён в item/end.

Цитата(PsiMagistr @  11.5.2011,  16:29 Найти цитируемый пост)
Сижу в демке, но 90 процентов кода не понимаю.


Тот код, что в .pas модулях - понимать не надо. Это служебный код, который надо взять и использовать. 

Сама демка - это код в .dpr. Вот его надо разбирать.

Смотрите, как я уже говорил выше, TPersistent сам себя сохранять не умеет. Это можно легко добавить. Так сделано в http://delphikingdom.ru/asp/viewitem.asp?catalogid=1426 Там создаётся наследник TPersistent, который получает возможность сериализовать и десериализовать сам себя. Как видите, там всего пара строчек.

Вот, если вы наследуетесь от TBaseObject из той статьи, то автоматом получаете SaveToStream и LoadFromStream.

Но. Если вам нужно сериализовывать TPersistent (а не наследника) и вам нужно больше контроля, то можно действовать сложнее - как сделал я в своей демке.

Я не думаю, что есть смысл разбирать мой код. Вся его суть сводится к тем же нескольким строчкам из http://delphikingdom.ru/asp/viewitem.asp?catalogid=1426 Всё остальное - это внешний обвес, позволяющий делать дополнительные плюшки.

А вам из этого кода нужно вынести только одно: _WritePersistent сохраняет объект в поток, _ReadPersistent - загружает. Остальное - в .dpr.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



CodeMonkey

Ящик пива с меня. Холодного. 

Я кончено рискую ВАс замучить, но


object CategoryPanel1: TCategoryPanel

Вот например, никогда бы не подумал, что можно и так написать.

Всегда считал, что все создается через классы.


Код


End;

type

Obj =  class(TCategoryPanel)
.
.
.
.
End;


Дело в том, что толковых книг по концепции ООП вообще практически нет. А вопросов у меня куча мала...

Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 17:29


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  11.5.2011,  18:27 Найти цитируемый пост)
Вот например, никогда бы не подумал, что можно и так написать.


Эээээ....  а вы отличаете .dfm и .pas файлы?

Вот у вас написано:

Код
type
  TForm1 = class(TForm) 
    Button1: TButton;
    Label1: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;


Вы что думаете это такое? Это - определение класса. Указана ли здесь информация о состоянии класса (т.е. "кнопка Button1 расположена по центру окна, которое имеет размеры 800x600")? Нет. Эта информация хранится отдельно - в .dfm файле. И загружается оттуда LoadFromStream (в моём примере: аналог - _ReadPersistent).

Вот в .dfm и написано:
Код
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 600
  ClientWidth = 800
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -13
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 120
  TextHeight = 16
  object Button1: TButton
    Left = 176
    Top = 120
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
  end
end

Это - не Паскаль. Это - не код. Это - не определение класса. Это - сохранённое состояние объекта в текстовой форме. Т.е. просто данные.

Да, сохранённые данные, несомненно, связаны с определением класса. Но это - разные вещи.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Я понял.

В общем все реальные данные о состоянии вынесены в отдельный файл. 

Уфф. Продолжаю разбираться.

Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 18:11


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 11.5.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1




CodeMonkey

РАЗБИРАЮСЬ. 

С Б-ей и Вашей помощью.


 UnitDefaultPersFiler in '..\UnitDefaultPersFiler.pas',
  UnitPersistent in '..\UnitPersistent.pas';

Какие-то особые модули, идущие в комплекте?



 _WritePersistent(FS, T, TDefaultTextWriter);

Вопрос. Что означает символ подчеркивания в начале строки?

Передаваемые параметры.

ПРавильно ли я понимаю:

1) FS - файловый поток Указатель-объект, класса TFileStream

2) T - сам записываемый объект.

3) TDefaultTextWriter - хотелось бы уточнить что это? На параметр не похоже. Указание особого режима?





Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 18:34


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 11.5.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Код

//Объявление конструктора.
constructor Create(const AStr: String = ''; const AInt: Integer = 0);




Почему везде употребляется служебное слово const? И что оно означает в данном конкретном случае. Если это передаваемый параметр, он ведь может изменяться? Т.е. ему нельзя быть const?

Разве недостаточно constructor Create(AStr: String; AInt: Integer);

Или const в данном случае означают те значения, которые будут переданы в поля, если конструктор вызван без параметров?

Object = TClass.Create; //Полям подставляются значения-константы. В нашем случае ' ' и 0

Вместо

Object  = TClass.Create(значение, значение); //Поля принимают введенные значения



Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 18:55


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  11.5.2011,  19:31 Найти цитируемый пост)
 UnitDefaultPersFiler in '..\UnitDefaultPersFiler.pas',
  UnitPersistent in '..\UnitPersistent.pas';

Какие-то особые модули, идущие в комплекте?


Это PersistentDemo.zip\UnitDefaultPersFiler.pas и PersistentDemo.zip\UnitPersistent.pas. Лежат в каталоге выше от PersistentDemo.zip\Demo\ProjectDemo.dpr

В эти модули вынесен служебный код. Там находится реализация _WritePersistent и _ReadPersistent

Цитата(PsiMagistr @  11.5.2011,  19:31 Найти цитируемый пост)
Что означает символ подчеркивания в начале строки?


Ничего. Мне так захотелось. 

Цитата(PsiMagistr @  11.5.2011,  19:31 Найти цитируемый пост)
Передаваемые параметры.

ПРавильно ли я понимаю:

1) FS - файловый поток Указатель-объект, класса TFileStream

2) T - сам записываемый объект.


Прототип функции записан в UnitPersistent.pas. Его можно увидеть, если зажать Ctrl и щёлкнуть левой кнопкой мыши по _WritePersistent.

Вот:
Код
function _ReadPersistent(const AStream: TStream; const AInstance: TPersistent; const AReaderClass: TPersistentReaderClass = nil): TPersistent; overload;
function _ReadPersistent(const AStream: TStream; const AInstance: TPersistent; const AReader: TPersistentReader): TPersistent; overload;

procedure _WritePersistent(const AStream: TStream; const AInstance: TPersistent; const AWriterClass: TPersistentWriterClass = nil); overload;
procedure _WritePersistent(const AStream: TStream; const AInstance: TPersistent; const AWriter: TPersistentWriter); overload;


Цитата(PsiMagistr @  11.5.2011,  19:31 Найти цитируемый пост)
3) TDefaultTextWriter - хотелось бы уточнить что это? На параметр не похоже. Указание особого режима?


Это опциональный параметр. Указывает, какой сериализатор использовать при сохранении. По умолчанию сериализатор в Delphi гонит в двоичный формат TPF0.

Вы можете использовать другой сериализатор. Например, тот, который пишет в текстовой форме. Именно это и делает TDefaultTextWriter - пишет в стандартный текстовый формат Delphi. Так что вам не нужно вызывать ObjectBinaryToText.

Список доступных сериализаторов можно посмотреть в модуле UnitDefaultPersFiler.pas. Пока их всего 4: читалка/писалка в двоичный формат и читалка/писалка в текстовый формат.

Добавлено через 4 минуты и 22 секунды
Цитата(PsiMagistr @  11.5.2011,  19:47 Найти цитируемый пост)
Почему везде употребляется служебное слово const?


Потому что это хороший стиль.

Цитата(PsiMagistr @  11.5.2011,  19:47 Найти цитируемый пост)
И что оно означает в данном конкретном случае


Constant Parameters

Цитата(PsiMagistr @  11.5.2011,  19:47 Найти цитируемый пост)
Разве недостаточно constructor Create(AStr: String; AInt: Integer);


Достаточно, но плохо.

Цитата(PsiMagistr @  11.5.2011,  19:47 Найти цитируемый пост)
Или const в данном случае означают те значения, которые будут переданы в поля, если конструктор вызван без параметров?


Нет.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Верно ли я понимаю, что

_WritePersistent(FS, T);

 _ReadPersistent(FS, T);


те самые функции, код которых и расположен в подключаемых выше файлах?



Никогда не сталкивался с  FS := TFileStream.Create('.\SaveDemo.bin', fmCreate or fmShareExclusive);

словом or в данном случае. 



Записать все три способа сохранения в одну процедуру Run? Наверно, лучше  отдельные процедуры - для каждого способа своя.

Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 19:13


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  11.5.2011,  20:12 Найти цитируемый пост)
Верно ли я понимаю, что

_WritePersistent(FS, T);

 _ReadPersistent(FS, T);


те самые функции, код которых и расположен в подключаемых выше файлах?


Да.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 12.5.2011, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Немного зеленых вопросов по ООП

1) Я написал класс на основе другого класса. Например:

Код

type

MySuperClass = class(TPersistent)
private

//Прайвит Поля

fMyName:String;//
fMySirName:String;//
fMyFamilyName:String;//
fMyAge:Integer;//

//Свойства

public //Конец секции прайвит, открываемся публике.

Property MyName:String read fMyName write fMyName;
Property MySirName:String read fMySirName write fMySirName;
Property MyFamilyName:String read fMyFamilyName write fMyFamilyName;
Property MyAge:Integer read MyAge write fMyAge;

// И Методы

//Конструктор

constructor Create (MyName:String;MySirName:String; MyFamilyName:String;MyAge:Integer); 

end; //Конец описания класса


implementation //Секция имплементейшн Реализуем конструктор. Присвоение полям начальных значений.

constructor MySuperClass.Create (MyName:String;MySirName:String; MyFamilyName:String;MyAge:Integer); 

begin
inherited Create;
FMyName:MyName;
FMySirName:= MySirName;
FMyFamilyName:=FamilyName;
FMyAge:=MyAge;
end;

//Конец реализации конструктора.



Вопросы знатокам:

1) Все ли описано верно?

2) Возможно ли в конструкторе обращение не к полям а к свойствам (В конструкторе выполнится функция, обслуживающая поле, вместо простого присвоения значения.

3) Главный вопрос. Нужен ли классу деструктор? Ведь стандартный деструктор Persistent ничего не знает о новых полях, следовательно он не сможет их погасить? 

Или же не так?

4) Если деструктор все-таки нужен, как прописать там уничтожение полей?


Это сообщение отредактировал(а) PsiMagistr - 12.5.2011, 10:11


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 12.5.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
1) Все ли описано верно?


За исключением нескольких опечаток - да.

Но вот так будет "правильнее":

Код
type
  TMySuperClass = class(TPersistent)
  private
    FName: String;
    FSirName: String;
    FFamilyName: String;
    FAge: Integer;
  public
    constructor Create(const AName, ASirName, AMyFamilyName: String; const AMyAge: Integer); 
  published
    property Name: String read FName write FName;
    property SirName: String read FSirName write FSirName;
    property FamilyName: String read FFamilyName write FFamilyName;
    property Age: Integer read FAge write FAge;
  end;

implementation

constructor TMySuperClass.Create(const AName, ASirName, AFamilyName: String; const AAge: Integer); 
begin
  inherited Create;
  FName := AName;
  FSirName := ASirName;
  FFamilyName := AFamilyName;
  FAge := AAge;
end;


В основном тут стилистические исправления.

Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
2) Возможно ли в конструкторе обращение не к полям а к свойствам (В конструкторе выполнится функция, обслуживающая поле, вместо простого присвоения значения.


Да.

Вообще, если свойство не имеет методов-акцессоров, то обращаться к полю или сасому свойству - без разницы и дело вкуса. Если у свойства есть метод-акцессор, то тут надо смотреть, чего мы хотим. Как правило, обращение будет идти к свойству. Делать это можно где угодно.

Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
3) Главный вопрос. Нужен ли классу деструктор?


Нет.

Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
Ведь стандартный деструктор Persistent ничего не знает о новых полях, следовательно он не сможет их погасить? 


Все строковые данные являются авто-финализируемыми типами. Они удаляются автоматически при освобождении объекта. Это даже не деструктор делает.

Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
как прописать там уничтожение полей?


Код
FName := '';


или

Код
Finalize(FName );



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 12.5.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Все строковые данные являются авто-финализируемыми типами. Они удаляются автоматически при освобождении объекта. Это даже не деструктор делает.

А если встречаются не строковые? Вот например у меня там есть интегровый тип

Добавлено через 9 минут и 22 секунды
Вообще, если свойство не имеет методов-акцессоров, то обращаться к полю или сасому свойству - без разницы и дело вкуса. 

Не совсем так. Я слышал, что ежели мы собираемся серилизовывать объект, то свойства необходимы. Причем  в секции published


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 12.5.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Они удаляются автоматически при освобождении объекта.

А что же его освобождает окромя деструктора?

Это сообщение отредактировал(а) PsiMagistr - 12.5.2011, 13:47


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1036 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.