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

Вниз

Автоматическое изменение полей записи - как?   Найти похожие ветки 

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

Наверх





Память: 0.55 MB
Время: 0.05 c
2-1208271421
webpauk
2008-04-15 18:57
2008.05.18
PageControl, Hint


3-1197035486
iZEN
2007-12-07 16:51
2008.05.18
Сравнить две СУБД (.mdb)


2-1208676926
Necromancer13
2008-04-20 11:35
2008.05.18
UNION в Паскале


2-1208335003
Andy BitOff (PPC)
2008-04-16 12:36
2008.05.18
Быстрое определение валидности Excel евского файла


2-1208521330
Динис_ИС
2008-04-18 16:22
2008.05.18
Как зашарить папку ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский