Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Автоматическое изменение полей записи - как? [D7, WinXP]


Страницы:   1 2 3

Blasphemie ©   (2008-04-16 22:06:00) 

Доброе время суток!
Давно не работал с Делфи, все позабывал. :(
Вопрос, собственно, такой:
Можно ли автоматизировать изменение одного поля записи в зависимости от другого. Есть:
type MyRec = record
ValueD: byte;
ValueS: Char;
end;
Так вот, мне надо, чтобы поле ValueS принимало значение ValueD, но в текстовом виде. ValueD может быть в диапазоне 1..9, поэтому Char достаточно.
Это вообще реализуемо?


Palladin   (2008-04-17 17:24:00) [21]

как же у тебя число 10 в один символ то уместилось?????


Blasphemie   (2008-04-17 17:14:00) [22]


> Заменим Integer на TMyInteger, Float на TMyFloat etc.


type
TZval=class(TObject)
 private
  iValueD: Byte;
  function lcGetAsString: Char;
 public
  property ValueD: Byte read iValueD write iValueD;
  property ValueS: Char read lcGetAsString;
 protected
  SqN: byte;
end;

function TZval.lcGetAsString;
begin
Result:=IntToStr(iValueD)[1];
end;

var Matrix: array[1..9,1..9] of TZval;
- вот так получилось в результате. ИМХО, вполне явно, и с преобразованием возиться не надо.


Германн   (2008-04-17 16:50:00) [23]


> Blasphemie ©   (17.04.08 15:44) [29]
>
>
> > Palladin
>
> Благодарю! Вот это мне и надо было!
>

Долой явное использование простых переменных! Заменим Integer на TMyInteger, Float на TMyFloat etc.


Blasphemie   (2008-04-17 15:44:00) [24]


> Palladin

Благодарю! Вот это мне и надо было!


Palladin   (2008-04-17 14:59:00) [25]

во первых я не вижу никакого смысла в двух свойства Byte и Char, они прекрасно приводятся друг к другу простым приведением типов, так что данное откровение космического разума мне не понятно. во вторых, хочешь организовать что то вроде AsString, да без проблемм

Type
 TMyClass=Class
  Private
   m_nData:Byte;
   Function lcGetAsString:String;
   Procedure lcSetFromString(Const s:String);
  Public
   Property Data:Byte Read m_nData Write m_nData;
   Property AsString:String Read lcGetAsString Write lcSetFromString;
 End;

Function TMyClass.lcGetAsString;
Begin
Result:=IntToStr(m_nData);
End;

Procedure TMyClass.lcSetFromString;
Begin
m_nData:=StrToInt(s);
End;


Blasphemie   (2008-04-17 14:47:00) [26]


> Делается одно приватное поле класса (Byte or Char по вкусу)
> и туева хуча property интересующего типа (хоть boolean),
>
> доступ к которым осуществляется необходимыми
> protected методами доступа.

Интуитивно понятно. Пример бы, если не сложно...


Palladin   (2008-04-17 13:52:00) [27]

и я того же мнения... )


Leonid Troyanovsky   (2008-04-17 13:48:00) [28]


Blasphemie ©   (16.04.08 22:06)

Не надо болтать глупостями.

Делается одно приватное поле класса (Byte or Char по вкусу)
и туева хуча property интересующего типа (хоть boolean),
доступ к которым осуществляется необходимыми
protected методами доступа.

--
Regards, LVT.


Blasphemie   (2008-04-17 12:49:00) [29]


> ValueD = 1;
> ValueS = '1';

Именно!
Причем извне будет изменяться только ValueD, ValueS жестко к ней привязана, только для отображения.


Anatoly Podgoretsky   (2008-04-17 08:37:00) [30]

> Loginov Dmitry  (17.04.2008 08:02:21)  [21]

Варианты тут не нужны, автор хочет избежать преобразованием, хочет дублирование информации.


Palladin   (2008-04-17 08:12:00) [31]

и на кой нужна эта избыточность данных, позвольте поинтересоваться?


Loginov Dmitry   (2008-04-17 08:02:00) [32]

> И почитай про вариантные записи. (Да и на будущее пригодится)
> P.S. Если можешь, хоть с грехом пополам, понять аглицкую
> справку, то читай в ней про Variant parts in records. Это
> как раз то, что тебе доктор прописал, а


А причем тут вариантные списки? Автор хотит чтоб было:
ValueD = 1;
ValueS = '1';

А тут не вариантные записи нужны, а собственно варианты.


Германн   (2008-04-17 04:22:00) [33]


> А в том, что не работает. Компилируется, только вот в Memo1
> ничего не появляется, кроме пробелов.
>

А что ты хочешь? Что "не работает"?


Blasphemie   (2008-04-17 02:12:00) [34]


> Я хотел схохмить типа "Ты претендуешь на звание самого читающего
> чукчи?

Хуже... Я претендую на звание самого непонимающего чукчи. :) Прочел, еще раз. Пишу код, просто ради проверки:

Zval = record
//  SqN: byte;
  case boolean of
   false: (ValD: Byte);
   true: (ValS: Char);
end;

var SomeWhat: Zval;

procedure Fill;
var Stp: byte;
begin
randomize;
for stp:=0 to 10 do
begin
 Somewhat.ValD:=random(9);
 Memo1.Text:=Memo1.Text+somewhat.ValS+' ';
end;
end;

Понятно, что это просто пример, на самом деле это висит на кнопке, но не в этом суть. А в том, что не работает. Компилируется, только вот в Memo1 ничего не появляется, кроме пробелов.


Германн   (2008-04-17 01:19:00) [35]


> Германн ©   (17.04.08 01:09) [17]
>
>

Усталость и годы виноваты. :(
Я хотел схохмить типа "Ты претендуешь на звание самого читающегочукчи?


Германн   (2008-04-17 01:09:00) [36]


> Blasphemie ©   (17.04.08 01:03) [16]
>
>
> > P.S. Если можешь, хоть с грехом пополам, понять аглицкую
> > справку, то читай в ней про Variant parts in records.
>
> Это я первым делом прочел, прежде, чем по форумам писать.
>  :) Но это не совсем то, что надо. Там выбирается тип одного
> поля, а мне нужны именно оба поля, чтобы не вызывать каждый
> раз chr или IntToStr при изменении одного значения.

Очень хреново прочёл. (Ты претендуешь на звание самого нечитающего чукчи? :)
Там одно и то же поле компилятор способен трактовать по разному, как автор программы пожелает.
P.S. Почитай всё-таки книжки.


Blasphemie   (2008-04-17 01:03:00) [37]


> P.S. Если можешь, хоть с грехом пополам, понять аглицкую
> справку, то читай в ней про Variant parts in records.

Это я первым делом прочел, прежде, чем по форумам писать. :) Но это не совсем то, что надо. Там выбирается тип одногополя, а мне нужны именно оба поля, чтобы не вызывать каждый раз chr или IntToStr при изменении одного значения. Да и просто уже интересно стало - неужто не получится... :)


Германн   (2008-04-17 00:47:00) [38]


> Blasphemie ©   (17.04.08 00:33) [14]
>
>
> > Германн
>
> Мне показалось так логичнее - с byte собственно оперировать,
>  а char использовать для вывода, чтобы не приводить его
> постоянно в приемлемый вид с каждым изменением, этих переменных
> целый массив.
>

Так я и знал! Значит мой телепатор ещё кое на что годится. :)
Купи книжку для начинающих. Но не по Дельфи, а по Паскалю. И почитай про вариантные записи. (Да и на будущее пригодится).

P.S. Если можешь, хоть с грехом пополам, понять аглицкую справку, то читай в ней про Variant parts in records. Это как раз то, что тебе доктор прописал, а
> oxffff ©   (16.04.08 22:16) [3]
в данном случае - попытка с помощью высшей математики вычислить результат 2+2.


Blasphemie   (2008-04-17 00:33:00) [39]


> Германн

Мне показалось так логичнее - с byte собственно оперировать, а char использовать для вывода, чтобы не приводить его постоянно в приемлемый вид с каждым изменением, этих переменных целый массив.


Германн   (2008-04-17 00:19:00) [40]


> Blasphemie ©   (16.04.08 22:06)
>
> Доброе время суток!
> Давно не работал с Делфи, все позабывал. :(
> Вопрос, собственно, такой:
> Можно ли автоматизировать изменение одного поля записи в
> зависимости от другого. Есть:
> type MyRec = record
> ValueD: byte;
> ValueS: Char;
> end;
> Так вот, мне надо, чтобы поле ValueS принимало значение
> ValueD, но в текстовом виде.

Какая-то дурацкая мышиная возня. Ты можешь внятно и разумно объяснить зачем тебе нужно в одной структуре данных хранить два поля с одними и те ми же данными?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо