Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.06;
Скачать: CL | DM;

Вниз

ООП   Найти похожие ветки 

 
v2 ©   (2010-12-15 13:59) [40]

[38]:
Код из [2] не работает,

[39]:
а в базах не силен я.


program df;

type
TDummy=class end;

TBase=class
 public
  constructor  Create;  virtual;
  procedure    Free;    virtual;
 public  class var fI   :Integer;
 public  class var Objs :array of Pointer;
 public  class procedure Load;
 public  class procedure Init;  virtual;
 public  class procedure Fin;   virtual;
end;

TChild=class(TBase)
 public
  fW         :Integer;
  procedure   Work;
  constructor Create; override;
  procedure   Free;   override;
 public  class procedure Init;  override;
 public  class procedure Fin;   override;

 public  class function Objs(i:Integer):TChild;
 public  class function ObjC:Integer;
end;

//-------------
constructor TBase.Create;
begin
Objs[fI]:=Self;
end;

class procedure TBase.Fin;
var
i:Integer;
begin
for i := Length(Objs)-1 downto 0 do
 (TDummy(Objs[i]) as Self).Free;
Finalize(Objs);
end;

procedure TBase.Free;
begin
inherited;
end;

class procedure TBase.Init;
begin
SetLength(Objs,10);
end;

class procedure TBase.Load;
var
i: Integer;
begin
for i := Length(Objs)-1 downto 0 do
 Self.Create;
end;

//------------
constructor TChild.Create;
begin
inherited;
Inc(fI);
end;

class procedure TChild.Fin;
begin
inherited;
end;

procedure TChild.Free;
begin
inherited;
end;

class procedure TChild.Init;
begin
fI:=0;
inherited;
Load;
end;

class function TChild.ObjC: Integer;
begin
Result:=Length(TBase.Objs);
end;

class function TChild.Objs(i: Integer): TChild;
begin
Result:=TBase.Objs[i];
end;

procedure TChild.Work;
begin
fW:=1;
end;
//---------------
var
i:Integer;
begin
TChild.Init;
for i:=TChild.ObjC-1 downto 0 do
 TChild.Objs(i).Work;
TChild.Fin;
end.


 
Ega23 ©   (2010-12-15 14:03) [41]


> Код из [2] не работает,


Он работает.


> а в базах не силен я.


А дело не в базах, а в самом обсуждении. Там топикстартеру правильный ответ был даден сразу, но он упорно настаивал, что "всё и так работает, вот только если мышкой выбрать дату, но иногда не работает".

Мой тебе совет: забудь на время про классовые методы. Ты ещё до них не дорос.


 
v2 ©   (2010-12-15 14:09) [42]

[41]:
>Он работает.

Приведи, пожалуйста, так как в [40], пример.


 
Ega23 ©   (2010-12-15 14:14) [43]


> Приведи, пожалуйста, так как в [40], пример.


В [40] написан бред. Написан человеком, который "слышал звон, да не знает где он".
Есть мнение, что так, как в [40] тебе никто не напишет. Ни на этом форуме, ни на каком-либо другом.


 
v2 ©   (2010-12-15 14:57) [44]

[43]:
> что так, как в [40]

Пожалуйста, так как в [40], простенький, но работоспособный пример, отображающий Ваш взгляд на решения вопроса.

Спасибо огромное, за Вашу помощь и участие.


 
Ega23 ©   (2010-12-15 15:15) [45]


> отображающий Ваш взгляд на решения вопроса.


Я вопроса так и не услышал.
Можно ли создать (вызвать Create) дочерний объект из базового класса?
Да, можно. Как это делается - тебе уже написали. То, что требуется более конкретное уточнение - тебе тоже написали.
Если ты не умеешь задавать вопросы, не удивляйся ответу "42".


 
v2 ©   (2010-12-15 16:23) [46]

[2]:
>Можно.
[45]:
>Я вопроса так и не услышал.

[2]:
>Но вопрос поставлен некорректно, требуется уточнение.
Какого рода уточнения Вам необходимы?

А если все-таки как-то можно, то приведите еще раз пример, потому как:

[4]:

>class procedure TBase.Load;
>begin
> with FAncestorClass.Create do  // E2124 Instance member "FAncestorClass" inaccessible here
> begin
>
> end;
>end;


 
clickmaker ©   (2010-12-15 16:26) [47]

> А если все-таки как-то можно, то приведите еще раз пример,
> потому как:
>
> [4]:
>
> >class procedure TBase.Load;
> >begin
> > with FAncestorClass.Create do  // E2124 Instance member
> "FAncestorClass" inaccessible here
> > begin
> >
> > end;
> >end;


а где и как объявлено FAncestorClass?


 
Ega23 ©   (2010-12-15 16:33) [48]


> А если все-таки как-то можно, то приведите еще раз пример,
>  потому как:


Очень просто. Это - классовый метод. Со всеми вытекающими последствиями.
А FAncestorClass - это приватное поле экземпляра класса.
Разницу чуешь?


 
v2 ©   (2010-12-15 16:33) [49]

[4]:

>TBase = class (.....)
> class procedure Load;
> property AncestorClass: TAncestorClass read FAncestorClass write FAncestorClass;
>end;


 
v2 ©   (2010-12-15 16:35) [50]

Re [48]

Чую, но как применить Ваш пример?


 
Ega23 ©   (2010-12-15 16:51) [51]


> Чую, но как применить Ваш пример?


Заменить class procedure Load на просто procedure Load
Я опечатался.
А тебе пока забыть о существовании классовых методов и переменных. Сначала с обычными разберись.


 
v2 ©   (2010-12-15 17:15) [52]

Ok, забыл о существовании классовых методов и переменных.

На Ваш пример [4] был такой отзыв:

[6]:
>> [4]: получаем TChild = class(TAncestor), а хотелось бы  TChild = сlass(TBase)

Вы это как-то прокомментируете?


 
Ega23 ©   (2010-12-15 17:31) [53]


> Вы это как-то прокомментируете?


Я уже перестал понимать твой полёт мысли.
Изложи чётко и по пунктам: что ты хочешь получить.
Без собственных догадок, как это сделать, без кода. Чётко и словами.


 
v2 ©   (2010-12-15 17:48) [54]

Спасибо за диалог, чуть позже (+4 часа) изложу суть вопроса.


 
Ega23 ©   (2010-12-15 17:50) [55]


> Спасибо за диалог, чуть позже (+4 часа) изложу суть вопроса.


Хорошо, из дома вечером посмотрю.


 
KSergey ©   (2010-12-15 22:14) [56]

> Игорь Шевченко ©   (15.12.10 10:19) [27]
> а TotalCommander ты тоже купил ?

Предлагаю спросить еще про налоги.


 
v2 ©   (2010-12-16 01:15) [57]

Что есть:

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

Процедура открывает файл, проверяет наличие в нем данных и вызывает функцию обратного вызова, которая возвращает ей указатель, с которым дальше и работает процедура.
Примитивно, - копирует в (полученный указатель + смещениям с массива)  порции данных с файла. Если массив смещений иссяк, а данные в файле есть – продолжаем с процедуры обратного вызова, переместившись в начало массива смещений. Если же данных в файле больше нет, то и все.

Что нужно:

Как-то записывать все то, что напередавала функция обратного вызова процедуре

Как нужно:

Чтобы вся рутинная работа выполнялась подальше, а "мы" примазались бы к работягам, сказав, что функция теперь работает только на `нас` и имя файла теперь "наш", заполнили бы  массив смещений и инициировали вызов процедуры.
При этом таких "мы" может быть много, и они потом желают видеть только "своих" - записи-результаты функции.

ЗЫ
Словами получилось, четко - нет.

ЗЗЫ
Вот теперь это точно бред, … срочно спать.


 
Германн ©   (2010-12-16 01:57) [58]


> v2 ©   (16.12.10 01:15) [57]

И при чём тут ООП?


 
Servy ©   (2010-12-16 08:35) [59]


> Процедура, которой необходимо передать:
> - имя файла;
> - указатель на динамический массив целых со знаком (массив
> смещений);
> - указатель на функцию обратного вызова (должна возвратить
> указатель на блок памяти);
> - указатель,  будет передан в функцию обратного вызова.


Боюсь, вы в очередной раз изложили не задачу, а ваш способ решения. Хорошая задача могла бы звучать так:

Хочу уметь сохранять и загружать свои объекты, а именно значения их свойств, в файл. Требуется создать такой класс, чтобы при наследовании от него для сериализации объекта и загрузки его назад из файла требовался минимум усилий. На такой вопрос, к примеру, ответ в ветке был дан.

То, что вы излагаете содержит какие-то массивы, указатели и прочие сущности, а нафига вы хотите их нагородить - не разъяснено. До выяснения, боюсь вам тут никто не поможет.


 
Ega23 ©   (2010-12-16 10:00) [60]


> Боюсь, вы в очередной раз изложили не задачу, а ваш способ
> решения.


Да не, задача изложена нормально. Процедура, указатель из callback-функции, буфер данных.
Это всё понятно и никакого отношения к ООП не имеет.


> Чтобы вся рутинная работа выполнялась подальше, а "мы" примазались
> бы к работягам, сказав, что функция теперь работает только
> на `нас`

Ну а вот дальше я нихрена не понял. Кто "мы"? Кого "нас"? Какие "работяги"?
Кто все эти люди?


 
v2 ©   (2010-12-16 13:47) [61]

>Это всё понятно и никакого отношения к ООП не имеет
Так я и хочу все это дело завернуть в ООП.

>Ну а вот дальше я нихрена не понял. Кто "мы"? Кого "нас"?
Просили "без кода", - это, один и тот же тип объектов.

>Какие "работяги"?
Базовый класс.

>Хорошая задача могла бы звучать так:
>Хочу уметь сохранять и загружать свои объекты, а именно значения их свойств, в файл.
>Требуется создать такой класс, чтобы при наследовании от него для сериализации объекта и загрузки его назад из файла
>требовался минимум усилий.

Ага, спасибо за понимание, и чтобы потом все загруженные объекты были под рукой, и при минимуме усилий освобождались при завершении.

>На такой вопрос, к примеру, ответ в ветке был дан.
Вы говорите о "[9]: См. справку по классу TPersistent." ?

Но у меня уже есть "мое, родное", и работает оно. И уже завернуто в ООП.
И мой ответ на мой вопрос [1] такой:
Self.Create; для не статичного классового метода

Но код мой [40] мастерами не признан был.

Вот и вопрос:
Как же такие ("Хорошая задача") задачи решают мастера и что не так в коде [40] ?


 
Ega23 ©   (2010-12-16 14:05) [62]

Я уже было понадеялся, что началось адекватное обсуждение.
А нет. Опять бредни про ООП, опять "статичные классовые методы", опять "Self.Create".
Лично мне - уже надоело. Даю последнюю попытку: объясни, что за задачу ты решаешь. Простыми словами, без своих догадок, как это надо сделать.


 
v2 ©   (2010-12-16 14:48) [63]

>Я уже было понадеялся, что началось адекватное обсуждение.
Я тоже.

>"статичные классовые методы"
поправка:
>>не статичного классового метода
: классового метода без спецификатора static;

>> Self.Create;
работает, и решает задачу, а именно
>Простыми словами:
Надо вызвать конструктор наследника из базового класса.

Ваши комментарии.


 
Ega23 ©   (2010-12-16 15:09) [64]

Попытка использована.
За сим - откланиваюсь.


 
v2 ©   (2010-12-16 15:41) [65]

>За сим - откланиваюсь.
Увы, рассказали, что все плохо, ничем не помогли, и убежали.

_Юрий, спасибо!

> Сделайте виртуальные классовые методы, которые возвращают
> в потомках другие экземпляры переменной

Натолкнуло на мысль, которая помогла найти решение, хотя непосредственно Вашим советом и не воспользовался.


 
Inovet ©   (2010-12-16 15:50) [66]

> [65] v2 ©   (16.12.10 15:41)
> Увы, рассказали, что все плохо, ничем не помогли, и убежали.

Так ты ничего не рассказал

> [62] Ega23 ©   (16.12.10 14:05)
> объясни, что за задачу ты решаешь. Простыми словами, без
> своих догадок, как это надо сделать.

но снова про то как ты это делаешь

> [63] v2 ©   (16.12.10 14:48)
> Надо вызвать конструктор наследника из базового класса.


 
v2 ©   (2010-12-16 16:06) [67]

Servy, Спасибо! Воспользуюсь Вашим постом.

>Требуется создать такой класс, чтобы при наследовании от него для сериализации объекта и загрузки его назад из файла
>требовался минимум усилий.


[63]:
>но снова про то как ты это делаешь
>> Надо вызвать конструктор наследника из базового класса.
Да, и в решении такой задачи меня смущало именно это.

А как бы Вы решали такую задачу?


 
icWasya ©   (2010-12-16 16:21) [68]

>А как бы Вы решали такую задачу?
Ну так задачу ты и неозвучил.


 
Ega23 ©   (2010-12-16 16:21) [69]

Во, вот теперь всё ясно. Задачка стандартная, по сериализации различных объектов. Встречается довольно регулярно. Решается тоже довольно просто.
Только вот незадача: последняя попытка была использована.


 
Anatoly Podgoretsky ©   (2010-12-16 16:56) [70]

> icWasya  (16.12.2010 16:21:08)  [68]

Ну что вы пристали, ну не может он.


 
v2 ©   (2010-12-16 17:01) [71]

[0]:
>>Можно ли создать (вызвать Create) дочерний объект из базового класса?

[2]:

>Можно. Но вопрос поставлен некорректно, требуется уточнение.


[3]:
>> Базовый класс должен автоматизировать создание дочерних объектов из потока входящих данных

[4]:


>TChild = class (TAncestor)
>public
> constructor Create; override;
>end;

>TBase = class (.....)
> class procedure Load;
> property AncestorClass: TAncestorClass read FAncestorClass write >FAncestorClass;
>end;



[6]:
>>получаем TChild = class(TAncestor), а хотелось бы  TChild = сlass(TBase)

[22]:
>Тебе уже показали, каким образом это делается.

[69]:
>Во, вот теперь всё ясно. Задачка стандартная, по сериализации различных объектов.

Прошу прощения за настойчивость, прокомментируйте кто-нибудь код (D2009) из поста [40]. Спасибо.


 
Amoeba_   (2010-12-16 17:05) [72]

В итоге имеем очередную сагу об X, Y и Z:
http://www.gunsmoker.ru/2008/10/x-y-z.html


 
Ega23 ©   (2010-12-16 17:15) [73]


> В итоге имеем очередную сагу об X, Y и Z:

Да, в яблочко.


 
v2 ©   (2010-12-16 17:22) [74]

Re: [72],[73]
Вам, наверное, здесь пряники раздают за количество постов, или как.


 
Юрий Зотов ©   (2010-12-16 19:28) [75]


> v2 ©


Если Вам нужна всего лишь сериализация объектов, то зачем изобретать велосипед, когда в Delphi она есть уже готовая?

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

Не вдумались Вы в [9] - а зря, сами себя на три дня наказали.



Страницы: 1 2 вся ветка

Текущий архив: 2011.03.06;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.014 c
15-1290554696
Дмитрий С
2010-11-24 02:24
2011.03.06
Для какого имени лучше купить сертификат.


2-1292409400
RUu
2010-12-15 13:36
2011.03.06
несоответствие типов


15-1290872112
Unknown_user
2010-11-27 18:35
2011.03.06
DCC32 и Turbo pascal


15-1290108478
Petr V. Abramov
2010-11-18 22:27
2011.03.06
Голосеевская улица


3-1254752327
man Yury
2009-10-05 18:18
2011.03.06
Как в динамический запрос передать значение null