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

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

проверить на тип


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

Bobby Digital ©   (2004-11-24 05:02:00) 

можно ли как то проверить тип данных введных, например в Edit не используя try ... exсept


Германн   (2004-11-27 00:58:00) [1]

2 GuAV ©   (26.11.04 14:29) [40]
>var
> DummyParam: record
>   case TDataType of
>     dtInteger: (I: Integer);
>     dtFloat:   (F: Double);
> end;

Имхо, это все-таки не лучше absolute. Это просто другой путь имеющий свою ценность.
На Ваша реализация грешит явным переизбытком сущностей.
 1. TDataType - явное излишество. Он никому не нужен никогда в данной ситуации.
 2. Соответсвенно - dtInteger и dtFloat тоже.

Кроме того в более сложных ситуациях, которые упоминал я, необходимоиспользование волшебного слова packed.

А вообще-то есть пожалуй единственный плюс в Вашем варианте замены absoluteна record. В нем неважен порядок перечисления вариантов.


GuAV   (2004-11-26 14:29:00) [2]

Германн ©   (26.11.04 4:11) [39]
Но другим алгоритмом типа absolute я пользуюсь до сих пор и не собираюсь от него отказываться. Это вариантный record.


Это всё же IMHO лучше absolute. В этом случае и я бы им воспоьзовался - cм [30].


Германн   (2004-11-26 04:11:00) [3]

Честно говоря раньше часто использовал absoluteв контексте:
var
 St : String;
 LenSt : Byte absolute St;


Но тогда речь шла о паскалевских строках и при формировании этих строк удобнее было писАть LenSt:=N, чем St[0]:=Chr(N) или удобнее было писАть N:=LenSt, чем N:=Ord(St[0]);

Но другим алгоритмом типа absoluteя пользуюсь до сих пор и не собираюсь от него отказываться. Это вариантный record. Он мне жизненно необходим, поскольку я получаю ответ от некоего железа. И этот ответ зависит от того, что у него запрашивают.


TankMan   (2004-11-25 19:39:00) [4]

Мдаааа...:)
absolut'но полезно вести такие вот дискуссии...сколько на пасскале уж мелких прожек переписал, а вот про absolute даже не слышал...

З.Ы.
Пользуясь случаем хочу сказать ЮЗ спасибо за рекомендованную книгу про создание компонентов в Delphi. Это именно та книга, которой мне не хватало. (не по теме, ну гдеж я еще мог поблагодарить человека :) )


Sha   (2004-11-25 19:17:00) [5]

jack128 ©   (25.11.04 18:50) [36]
Обрати внимание на пролог/эпилог процедуры.
С constполучается намного короче и быстрее.


jack128   (2004-11-25 18:50:00) [6]

jack128 ©   (25.11.04 18:49) [35]
я знаю, но это же НЕ серьёзно, ты же понимаешь.  


jack128   (2004-11-25 18:49:00) [7]

я знаю, но это же серьзно, ты же понимашь.  Если бы шло копирование строки, то да.. А так..  Хотя если уж за каждый байт с стеке бороться, то может и имеет смысл ;-)


GuAV   (2004-11-25 18:09:00) [8]

jack128 ©   (25.11.04 17:34) [32]

procedure ValueStringParameter(S: string);
begin
 ShowMessageFmt('ValueStringParameter. ref count = %D',
   [PInteger((Integer(S)-8))^]);
end;

procedure ConstantStringParameter(const S: string);
begin
 ShowMessageFmt('ConstantStringParameter. ref count = %D',
   [PInteger((Integer(S)-8))^]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var S: string;
begin
 S := StringOfChar('-', 5);
 ShowMessageFmt('Caller. ref count = %D',
   [PInteger((Integer(S)-8))^]);
 ValueStringParameter(S);
 ConstantStringParameter(S);
end;


Sha   (2004-11-25 18:03:00) [9]

jack128 ©   (25.11.04 17:34) [32]
Еще имеет смысл посмотреть в Debug Window :)


jack128   (2004-11-25 17:34:00) [10]

Sha ©   (25.11.04 16:21) [31]
не имеет. Если только для читабельности.


Sha   (2004-11-25 16:21:00) [11]

Еще имеет смысл добавить const в описание параметра:
function GetDataType(const S: string): TDataType;


GuAV   (2004-11-25 16:13:00) [12]

Юрий Зотов ©   (25.11.04 15:38) [28]
Не согласен, что ДАННЫЙ код от этого становится плохо читаемым

Ок, согласен плохо читаемым не становится.

Юрий Зотов ©   (25.11.04 15:37) [27]
3. В глубоких рекурсиях (а никогда нельзя знать, где и как будет использована твоя процедура) даже 1 байт стека может оказаться критичным.


1 байт стека - это как ? :-)

Юрий Зотов ©   (25.11.04 15:37) [27]
Поэтому, если есть возможность что-то сэкономить без ущерба для остального - стоит это делать.


Однако шанс сделать ошибку - тоже "учерб для остального". Здесь конечно же вследствие absolut'ной прозрачности кода её обнаружить легко.

PS: Лично я бы предпочёл такой код:
var
 DummyParam: record
   case TDataType of
     dtInteger: (I: Integer);
     dtFloat:   (F: Double);
 end;


Sha   (2004-11-25 16:11:00) [13]

> Bobby Digital ©   (24.11.04 05:02)

Не забудь только, что
TryStrToInt считает $1 и 0x1 целыми
TryStrToFloat считает 1E-10 плавающим


Юрий Зотов   (2004-11-25 15:38:00) [14]

Удалено модератором
Примечание: дубль


Юрий Зотов   (2004-11-25 15:37:00) [15]

> GuAV ©   (25.11.04 14:55) [26]

1. Согласен, что я плохо подумал, что мои представления о компиляторе оказались ошибочными, и что надо писать I absolute F.

2. Не согласен, что ДАННЫЙ код от этого становится плохо читаемым (в более сложных случаях - да, возможно, там и я тоже не стал бы злоупотреблять базированием, но ДАННЫЙ случай слишком прост и absolut'но прозрачен). Ссылку на "а что такое absolute" аргументом не считаю, поскольку в ней продемонстрирована не запутанность кода, а элементарное незнание языка. С таким же успехом можно сказать, что указатели тоже запутывают код, потому что не все понимают, что это такое.

3. В глубоких рекурсиях (а никогда нельзя знать, где и как будет использована твоя процедура) даже 1 байт стека может оказаться критичным. Поэтому, если есть возможность что-то сэкономить без ущерба для остального - стоит это делать.


GuAV   (2004-11-25 14:55:00) [16]

Юрий Зотов ©   (25.11.04 14:42) [23]
ЧЕМ правильнее?


тем что если при незначительной выгоде от absolute (4 байта в стеке по памяти, по скорости 0 или почти 0) так легко сделать ошибку. Что Вы и продемонстрировали.

также тем что код становится менее понятным, что продемонстрировано в  [18].


GuAV   (2004-11-25 14:50:00) [17]

Юрий Зотов ©   (25.11.04 14:42) [23]
Если первое утверждение верно, то неверно второе.


Я уже проверил.  [17] - AV.

Компилятор однозначно отведёт 4 байта. Первое утверждение верно.

Я думал что второе утверждение верно, исходя из того что Вы проверили код передтем как запостить. Компилятор выделил бы 4 байта но недостающие 4 байта не содержали бы используемых данных. Да, я ошибся второе утверждение не верно.


jack128   (2004-11-25 14:48:00) [18]

Юрий Зотов ©   (25.11.04 14:42) [23]
ЧЕМ правильнее?

вот этим, видимо

>GuAV ©   (25.11.04 1:36) [17][Ответить]
> Попробовал. GetDataType('7,8'); - AV. Прикольно.

;-)


Юрий Зотов   (2004-11-25 14:42:00) [19]

> GuAV ©   (25.11.04 01:25) [15]

> А не кажется ли Вам что

Мне кажется, что компилятор все же отведет 8 байт, а не 4.

> Вы можете конечно доказать, что ничего не перезаписываете, но
> всё же правильнее было бы I: integer absoulte F.

Если первое утверждение верно, то неверно второе.

> А ещё правильнее IMHO не экономить одно слово в стеке и
> объявиь F и I отдельно.

ЧЕМ правильнее?


ASoft   (2004-11-25 10:56:00) [20]

>>Leonid Troyanovsky[21]
Спасибо за инфу, собственно, то, что я и предполагал:
"on E: EDBEditError do
raise Exception.Create('My exception'); // do something" -
свой перехват Exception.


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

Наверх

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