![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Автоматическое изменение полей записи - как? [D7, WinXP]
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, но в текстовом виде.
Какая-то дурацкая мышиная возня. Ты можешь внятно и разумно объяснить зачем тебе нужно в одной структуре данных хранить два поля с одними и те ми же данными?