Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.03.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.62 MB
Время: 0.005 c
2-1292336344
vitge
2010-12-14 17:19
2011.03.06
Закрытие формы из другой формы


2-1291877608
Проходящий
2010-12-09 09:53
2011.03.06
Не работает метод Color компонентов.


4-1245953070
Nikfel
2009-06-25 22:04
2011.03.06
Как получить handle главного окна


2-1291905273
Vidog
2010-12-09 17:34
2011.03.06
Embedded-файлы


2-1292062969
rish
2010-12-11 13:22
2011.03.06
Integrated debugging





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский