Текущий архив: 2008.05.18;
Скачать: CL | DM;
ВнизАвтоматическое изменение полей записи - как? Найти похожие ветки
← →
Blasphemie © (2008-04-16 22:06) [0]Доброе время суток!
Давно не работал с Делфи, все позабывал. :(
Вопрос, собственно, такой:
Можно ли автоматизировать изменение одного поля записи в зависимости от другого. Есть:
type MyRec = record
ValueD: byte;
ValueS: Char;
end;
Так вот, мне надо, чтобы поле ValueS принимало значение ValueD, но в текстовом виде. ValueD может быть в диапазоне 1..9, поэтому Char достаточно.
Это вообще реализуемо?
← →
oxffff © (2008-04-16 22:08) [1]
> Это вообще реализуемо?
Да.
← →
Blasphemie © (2008-04-16 22:09) [2]
> Да
Информативненько! :)
Пойдем дальше - каким образом?
← →
oxffff © (2008-04-16 22:16) [3]MyRec = record
Private
lValueS: Char;
lValueD: byte;
procedure AssignValueD(value:byte);
public
property ValueS:char read lValueS;
property ValueD:byte read lValueD write AssignValueD;
end;
{ MyRec }
procedure MyRec.AssignValueD(value: byte);
begin
lValueS:=chr(48+value);
end;
procedure TForm1.FormCreate(Sender: TObject);
var a:MyRec;
begin
a.ValueD:=10;
showmessage(a.ValueS);
end;
← →
oxffff © (2008-04-16 22:17) [4]:)
procedure MyRec.AssignValueD(value: byte);
begin
lValueD:=value;
lValueS:=chr(48+ValueD);
end;
← →
Blasphemie © (2008-04-16 22:21) [5]oxffff
Спасибо огромное!
← →
Andy BitOff © (2008-04-16 22:33) [6]> oxffff © (16.04.08 22:16) [3]
Хм...
С какой версии? У афтара - [D7, WinXP]
← →
Blasphemie © (2008-04-16 22:36) [7]Угумс, не работает.
после private выдает
[Error] Prog.pas(42): "," or ":" expected but identifier "IVal" found
← →
oxffff © (2008-04-16 22:37) [8]
> Andy BitOff © (16.04.08 22:33) [6]
Не посмотрел.
procedure AssignValue(var rec: MyRec;value: byte);
begin
rec.ValueD:=value;
rec.ValueS:=chr(48+value);
end;
← →
Blasphemie © (2008-04-16 23:12) [9]
private
IVal: Byte;
IValS: Char;
procedure AssignValueD(var rec: Zval);// Здесь [Error] prog.pas(47): Incompatible types
public
property ValS:char read IValS;
property Val: byte read IVal write AssignValueD;
protected
SqN: byte;
end;
И еще record пришлось переделать в object, иначе вообще не хочет.
← →
Blasphemie © (2008-04-16 23:14) [10]Ошибся, в другом месте ошибка
private
IVal: Byte;
IValS: Char;
procedure AssignValueD(var rec: Zval);
public
property ValS:char read IValS;
property Val: byte read IVal write AssignValueD; // Вот здесь Error] prog.pas(47): Incompatible types
protected
SqN: byte;
end;
← →
Сергей М, (2008-04-16 23:31) [11]
> procedure AssignValueD(var rec: Zval);
Какой еще Zval ?
← →
Blasphemie © (2008-04-16 23:47) [12]
Zval = object
private
IVal: Byte;
IValS: Char;
procedure AssignValueD(value: byte);
public
property ValS:char read IValS;
property Val: byte read IVal write AssignValueD;
protected
SqN: byte;
end;
procedure Zval.AssignValueD(value: byte);
begin
IVal:=value;
IValS:=chr(48+IVal);
end;
Вот так это выглядит в результате. Только ничего не происходит.
Если сделать AssignValueD(var rec: Zval; value: byte);, то выдает Incompatible types.
← →
Германн © (2008-04-17 00:19) [13]
> Blasphemie © (16.04.08 22:06)
>
> Доброе время суток!
> Давно не работал с Делфи, все позабывал. :(
> Вопрос, собственно, такой:
> Можно ли автоматизировать изменение одного поля записи в
> зависимости от другого. Есть:
> type MyRec = record
> ValueD: byte;
> ValueS: Char;
> end;
> Так вот, мне надо, чтобы поле ValueS принимало значение
> ValueD, но в текстовом виде.
Какая-то дурацкая мышиная возня. Ты можешь внятно и разумно объяснить зачем тебе нужно в одной структуре данных хранить два поля с одними и те ми же данными?
← →
Blasphemie © (2008-04-17 00:33) [14]
> Германн
Мне показалось так логичнее - с byte собственно оперировать, а char использовать для вывода, чтобы не приводить его постоянно в приемлемый вид с каждым изменением, этих переменных целый массив.
← →
Германн © (2008-04-17 00:47) [15]
> 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 01:03) [16]
> P.S. Если можешь, хоть с грехом пополам, понять аглицкую
> справку, то читай в ней про Variant parts in records.
Это я первым делом прочел, прежде, чем по форумам писать. :) Но это не совсем то, что надо. Там выбирается тип одного поля, а мне нужны именно оба поля, чтобы не вызывать каждый раз chr или IntToStr при изменении одного значения. Да и просто уже интересно стало - неужто не получится... :)
← →
Германн © (2008-04-17 01:09) [17]
> Blasphemie © (17.04.08 01:03) [16]
>
>
> > P.S. Если можешь, хоть с грехом пополам, понять аглицкую
> > справку, то читай в ней про Variant parts in records.
>
> Это я первым делом прочел, прежде, чем по форумам писать.
> :) Но это не совсем то, что надо. Там выбирается тип одного
> поля, а мне нужны именно оба поля, чтобы не вызывать каждый
> раз chr или IntToStr при изменении одного значения.
Очень хреново прочёл. (Ты претендуешь на звание самого нечитающего чукчи? :)
Там одно и то же поле компилятор способен трактовать по разному, как автор программы пожелает.
P.S. Почитай всё-таки книжки.
← →
Германн © (2008-04-17 01:19) [18]
> Германн © (17.04.08 01:09) [17]
>
>
Усталость и годы виноваты. :(
Я хотел схохмить типа "Ты претендуешь на звание самого читающего чукчи?
← →
Blasphemie © (2008-04-17 02:12) [19]
> Я хотел схохмить типа "Ты претендуешь на звание самого читающего
> чукчи?
Хуже... Я претендую на звание самого непонимающего чукчи. :) Прочел, еще раз. Пишу код, просто ради проверки:
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 04:22) [20]
> А в том, что не работает. Компилируется, только вот в Memo1
> ничего не появляется, кроме пробелов.
>
А что ты хочешь? Что "не работает"?
← →
Loginov Dmitry © (2008-04-17 08:02) [21]> И почитай про вариантные записи. (Да и на будущее пригодится)
> P.S. Если можешь, хоть с грехом пополам, понять аглицкую
> справку, то читай в ней про Variant parts in records. Это
> как раз то, что тебе доктор прописал, а
А причем тут вариантные списки? Автор хотит чтоб было:
ValueD = 1;
ValueS = "1";
А тут не вариантные записи нужны, а собственно варианты.
← →
Palladin © (2008-04-17 08:12) [22]и на кой нужна эта избыточность данных, позвольте поинтересоваться?
← →
Anatoly Podgoretsky © (2008-04-17 08:37) [23]> Loginov Dmitry (17.04.2008 08:02:21) [21]
Варианты тут не нужны, автор хочет избежать преобразованием, хочет дублирование информации.
← →
Blasphemie © (2008-04-17 12:49) [24]
> ValueD = 1;
> ValueS = "1";
Именно!
Причем извне будет изменяться только ValueD, ValueS жестко к ней привязана, только для отображения.
← →
Leonid Troyanovsky © (2008-04-17 13:48) [25]
Blasphemie © (16.04.08 22:06)
Не надо болтать глупостями.
Делается одно приватное поле класса (Byte or Char по вкусу)
и туева хуча property интересующего типа (хоть boolean),
доступ к которым осуществляется необходимыми
protected методами доступа.
--
Regards, LVT.
← →
Palladin © (2008-04-17 13:52) [26]и я того же мнения... )
← →
Blasphemie © (2008-04-17 14:47) [27]
> Делается одно приватное поле класса (Byte or Char по вкусу)
> и туева хуча property интересующего типа (хоть boolean),
>
> доступ к которым осуществляется необходимыми
> protected методами доступа.
Интуитивно понятно. Пример бы, если не сложно...
← →
Palladin © (2008-04-17 14:59) [28]во первых я не вижу никакого смысла в двух свойства 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 15:44) [29]
> Palladin
Благодарю! Вот это мне и надо было!
← →
Германн © (2008-04-17 16:50) [30]
> Blasphemie © (17.04.08 15:44) [29]
>
>
> > Palladin
>
> Благодарю! Вот это мне и надо было!
>
Долой явное использование простых переменных! Заменим Integer на TMyInteger, Float на TMyFloat etc.
← →
Blasphemie © (2008-04-17 17:14) [31]
> Заменим 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;
← →
Palladin © (2008-04-17 17:24) [32]как же у тебя число 10 в один символ то уместилось?????
← →
Германн © (2008-04-17 17:29) [33]
> Blasphemie © (17.04.08 17:14) [31]
> Blasphemie © (17.04.08 12:49) [24]
>
>
> > ValueD = 1;
> > ValueS = "1";
>
> Именно!
> Причем извне будет изменяться только ValueD, ValueS жестко
> к ней привязана, только для отображения.
>
Нестыковочка однако. IntToStr(iValueD)[1] даст #1.
← →
Palladin © (2008-04-17 17:33) [34]да это вообще бред какой то...
← →
Blasphemie © (2008-04-17 17:41) [35]
> как же у тебя число 10 в один символ то уместилось?????
Переменная практически может принимать значения от 0 до 9, бОльшие значения туда писаться не будут.
← →
Palladin © (2008-04-17 17:45) [36]что означает char? строковое представление значения или просто приведение типа? тебе уже на увязочку указали.
если строковое представление, то достаточно
function TZval.lcGetAsString;
begin
Result:=Char(iValueD+Byte("0"));
end;
если все таки приведение типов
function TZval.lcGetAsString;
begin
Result:=Char(iValueD);
end;
а то что написано выше это туманное переливание из пустого в порожнее
← →
Blasphemie © (2008-04-17 18:00) [37]
> что означает char? строковое представление значения или
> просто приведение типа?
Строковое представление.
IntToStr(iValueD)[1] - чем этот способ плох?
При ValueD=7 автоматически происходит ValueS:="7", чего я, собственно, и добивался.
С ValueS никакие внешние операции не нужны, поэтому обратное соответствие необязательно.
← →
Palladin © (2008-04-17 18:03) [38]
> IntToStr(iValueD)[1] - чем этот способ плох?
он слишком "тяжелый", гонять число в строку, что бы получить всего лишь символьное представление числа от 0 до 9 это как гонятся за комаром с лопатой...
Char(iValueD+Byte("0"));
← →
Германн © (2008-04-17 18:06) [39]
> IntToStr(iValueD)[1] - чем этот способ плох?
При наличии в Паскале Char и Chr твой способ это некрасиво.
> При ValueD=7 автоматически происходит ValueS:="7"
Неверю.
← →
Blasphemie © (2008-04-17 18:08) [40]
> Char(iValueD+Byte("0"));
Спасибо, исправлю. :)
> Неверю
Вот честное слово!
← →
Германн © (2008-04-17 18:14) [41]
> Blasphemie © (17.04.08 18:08) [40]
>
>
> > Char(iValueD+Byte("0"));
>
> Спасибо, исправлю. :)
>
>
> > Неверю
>
> Вот честное слово!
>
??????
← →
Palladin © (2008-04-17 18:17) [42]
> Германн ©
ты меня так больше не смущай. IntToStr(1)[1] = "1"
← →
Blasphemie © (2008-04-17 18:32) [43]
> > При ValueD=7 автоматически происходит ValueS:="7"
>
> Неверю.
Я имел в виду, что так и происходит. Для неверия нет причин. :)
← →
Германн © (2008-04-17 18:34) [44]
> Palladin © (17.04.08 18:17) [42]
>
>
Извини. Временное помутнение рассудка :(((
← →
MsGuns © (2008-04-17 21:10) [45]Если автору поручить, например, писать программу печати банковских платежек, то как представлю себе как он реализует сумму прописью, так волосы на голове шевелятся..
← →
Blasphemie © (2008-04-17 21:22) [46]
> Если автору поручить, например, писать программу печати
> банковских платежек, то как представлю себе как он реализует
> сумму прописью, так волосы на голове шевелятся..
Гы... Я бы готовый компонент нашел, честно говоря. :)
← →
Anatoly Podgoretsky © (2008-04-17 21:24) [47]> MsGuns (17.04.2008 21:10:45) [45]
Ну как, естественно так
if A = 1 then S := "один"
else if A = 2 then S := "два"
...
else S := "ну это уже не число, а числище";
← →
MsGuns © (2008-04-17 21:33) [48]>Blasphemie © (17.04.08 21:22) [46]
>Гы... Я бы готовый компонент нашел, честно говоря. :)
Лучше компонентшу. Вдову миллионера. Тогда вообще нафих программирование не нужно ;)
← →
Blasphemie © (2008-04-17 21:39) [49]
> Тогда вообще нафих программирование не нужно ;)
Да мне, собственно, и так не особо нужно, я для развлечения и чтобы навыки (попробовать) восстановить, забыл уже все на свете. :)
← →
MsGuns © (2008-04-17 21:48) [50]С Вашим подходим к программированию (Делфи тут, собственно, не при чем) советую вообще заняться чем-нибудь другим. Ну там, коммерцией или еще чем..
← →
Blasphemie © (2008-04-17 21:58) [51]Да не программист я, и не собираюсь им становиться. Развлекаюсь!..
Я сисадмин-ремонтник-железячник, и это меня вполне устраивает. А программистом я подрабатывал в далеком студенческом 1990-м году, на Turbo Pascal"e, за почти 20 лет все можно позабывать.
← →
Германн © (2008-04-18 01:27) [52]
> Blasphemie © (17.04.08 21:58) [51]
>
> Да не программист я, и не собираюсь им становиться. Развлекаюсь!
> ..
>
Развлекайся в "Прочее". Это тебе советую я. "Железячник -ремонтник" :)
Страницы: 1 2 вся ветка
Текущий архив: 2008.05.18;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.043 c