Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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"));

Спасибо, исправлю. :)


> Неверю

Вот честное слово!



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

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

Наверх




Память: 0.57 MB
Время: 0.02 c
15-1207309630
Zvr@b
2008-04-04 15:47
2008.05.18
Правила составления ТЗ для программистов


2-1208370567
Вопрос
2008-04-16 22:29
2008.05.18
Как составить сложный запрос ?


15-1207479158
Ega23
2008-04-06 14:52
2008.05.18
Агоритмы шифрации с ключом


3-1197537619
novill
2007-12-13 12:20
2008.05.18
Поделитесь опытом. IB 7.5 Суперсервер или классический.


15-1207555479
vajo
2008-04-07 12:04
2008.05.18
Windows XP часто требует ввести код активации