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

Вниз

Чем чревато?   Найти похожие ветки 

 
Igorek ©   (2007-07-31 13:57) [0]

Всем привет.
Долго не писал на Делфи - покритикуйте процедурку:
procedure SetHints(ControlsAndHints: array of const);
type
PControl = ^TControl;
var
I, L: Integer;
Control: PControl;
Hint: PAnsiString;
begin
//expected array [TControl, String, TControl, String...]
L := Length(ControlsAndHints);
if not (L mod 2 = 0) or (L = 0) then
 Exit;

for I := 0 to L - 1 do
 if I mod 2 = 0 then
 begin
  Control := @(ControlsAndHints[I]);
  Hint := @(ControlsAndHints[I + 1]);
  Control^.Hint := Hint^;
  Control^.ShowHint := True;
 end;
end;

Вроде работает, но не будет ли проблем с менеджером строк?


 
Igorek ©   (2007-07-31 14:01) [1]

Почему так? Просто удобно использовать. :)

SetHints([
 imgLogo, Options.HomeWebPage,
 edLogin, "User Name to login to server",
 edPassword, "Password to login to server"
]);


 
jack128_   (2007-07-31 14:10) [2]

Ну я бы пеерписал это так:

procedure SetHints(ControlsAndHints: array of const);
var
 I, L: Integer;
 Control: TControl;
 Hint: AnsiString;
begin
//expected array [TControl, String, TControl, String...]
 L := Length(ControlsAndHints);
 if not (L mod 2 = 0) then
   Exit;

 for I := 0 to L - 1 do
   if I mod 2 = 0 then
   begin
     Assert(TVarRec(ControlsAndHints[I]).VType = vtObject);
     Assert(TVarRec(ControlsAndHints[I+1]).VType = vtAnsiString);
     Control := TVarRec(ControlsAndHints[I]).VObject as TControl;
     Hint := string(TVarRec(ControlsAndHints[I + 1]).VAnsiString);
     Control.Hint := Hint;
     Control.ShowHint := True;
   end;
end;


 
Sandman29 ©   (2007-07-31 14:28) [3]

Лучше Assert вместо exit, если массив с нечетным количеством элементов.


 
Igorek ©   (2007-07-31 15:39) [4]


> jack128_   (31.07.07 14:10) [2]

Спасибо! Прикольньій изврат с вариантами.


> Sandman29 ©   (31.07.07 14:28) [3]

Ок.


 
@!!ex ©   (2007-07-31 16:07) [5]

Assert в Delphi???
Delphi же не умеет читать код и выводить его, как же он работает???


 
ANTPro ©   (2007-07-31 16:21) [6]

> [5] @!!ex ©   (31.07.07 16:07)

Так научи :)


 
Igorek ©   (2007-07-31 16:56) [7]

Чтоб использовать с TAction (и другими типами со свойством Hint) пришлось подкрутить:
procedure SetHints(ControlsAndHints: array of const);
var
I, L: Integer;
Hint: AnsiString;
Obj: TObject;
begin
(*ControlsAndHints - expected array [TObject, String, TObject, String...]
 where each TObject:
  - must have property "Hint"
  - may have property "ShowHint"
  - may be nil
   *)
L := Length(ControlsAndHints);
Assert(L mod 2 = 0);
for I := 0 to L - 1 do
 if I mod 2 = 0 then
 begin
  Assert(TVarRec(ControlsAndHints[I]).VType = vtObject);
  Assert(TVarRec(ControlsAndHints[I + 1]).VType = vtAnsiString);
  Obj := TVarRec(ControlsAndHints[I]).VObject as TObject;
  if not Assigned(Obj) then
   continue;
  Hint := string(TVarRec(ControlsAndHints[I + 1]).VAnsiString);
  TypInfo.SetStrProp(Obj, "Hint", Hint);
  if Assigned(TypInfo.GetPropInfo(Obj, "ShowHint")) then
   TypInfo.SetEnumProp(Obj, "ShowHint", "True");
 end;
end;


 
Sandman29 ©   (2007-07-31 17:07) [8]

Igorek ©   (31.07.07 16:56) [7]

Кроме for, в Delphi есть еще операторы цикла :)


 
@!!ex ©   (2007-07-31 17:10) [9]

> [6] ANTPro ©   (31.07.07 16:21)
> > [5] @!!ex ©   (31.07.07 16:07)
>
> Так научи :)

Как?

P.S.
Посмотрел Assert... ждал что будет действительно Assert  а не сообщение об ошибке с номером строки. :(


 
Sandman29 ©   (2007-07-31 17:14) [10]

@!!ex ©   (31.07.07 17:10) [9]

Ты еще затребуй, чтобы как в Java, можно было директивой в run-time управлять, будет ли выполняться assert.

PS. Я же говорил, что у Delphi нет перспективы :)


 
jack128_   (2007-07-31 17:24) [11]


> Посмотрел Assert... ждал что будет действительно Assert

А что в твоем понимании "дествительно Assert" ??


 
ANTPro ©   (2007-07-31 17:30) [12]

> [9] @!!ex ©   (31.07.07 17:10)
> Как?

У тебя есть путь к файлу, есть строка в нем. Только нафиг это, хз.


 
wp2 ©   (2007-07-31 17:30) [13]

Может я где-то туплю, но "переменная Control не используется..."


 
Igorek ©   (2007-07-31 17:37) [14]


> Sandman29 ©   (31.07.07 17:07) [8]
> Igorek ©   (31.07.07 16:56) [7]
>
> Кроме for, в Delphi есть еще операторы цикла :)

Есть, сер!
I := 0;
while I < L do
begin
 Assert(TVarRec(ControlsAndHints[I]).VType = vtObject);
 Assert(TVarRec(ControlsAndHints[I + 1]).VType = vtAnsiString);
 Obj := TVarRec(ControlsAndHints[I]).VObject as TObject;
 if not Assigned(Obj) then
  continue;
 Hint := string(TVarRec(ControlsAndHints[I + 1]).VAnsiString);
 TypInfo.SetStrProp(Obj, "Hint", Hint);
 if Assigned(TypInfo.GetPropInfo(Obj, "ShowHint")) then
  TypInfo.SetEnumProp(Obj, "ShowHint", "True");
 Inc(I, 2);
end;


 
@!!ex ©   (2007-07-31 17:40) [15]

Правильный Assert в C.
Он указывает в чем ошибка.
Например показываю я версию, приносят новый ресурсы, сорсов с собой нету, естественно.
Вываливается ошибка: "бла-бла-бла TextureLib.pas line 430"
И чем там за ошибка?? Я х.з. и показ обламывается.
Или скажем дизайнер работает, у него вываливается подобное сообщение, а я код правил у меня пол модуля переписано, и эта строчка давно уже не 430.... Мне лезть в репозиторий, доставать старую версию, смотреть ошибку, возвращать новую версию, править ее.
Если же у меня написано в Ассерте: "бла-бла-бла TextureLib.pas line 430 BitCount == 24" я сразу знаю что это, сразу лезу и правлю текстуру, без всякого кода. Вот что в моем понимании "действительно Assert"


 
wp2 ©   (2007-07-31 17:41) [16]

Почему так? Просто удобно использовать. :)

SetHints([
imgLogo, Options.HomeWebPage,
edLogin, "User Name to login to server",
edPassword, "Password to login to server"
]);


Я тоже такие вещи люблю. Но почему-то обходился без указателей...


 
Igorek ©   (2007-07-31 17:44) [17]


> @!!ex ©   (31.07.07 17:40) [15]

В репозитории (напр. svn) всегда есть версия. Также ета версия доступна пользователю в окне About.


 
@!!ex ©   (2007-07-31 17:46) [18]

> [17] Igorek ©   (31.07.07 17:44)

Вот я и говорю, а если нет версии рядом?

Я например часто Сшные игрушки лечил сам, не имея их кода, естественно.
В модинге опять же полезно...


 
Sandman29 ©   (2007-08-01 09:27) [19]

if not Assigned(Obj) then
begin
 Inc(I, 2);
 continue;
end;

иначе зациклится


 
Игорь Шевченко ©   (2007-08-01 09:40) [20]


> Правильный Assert в C.
> Он указывает в чем ошибка.


> Или скажем дизайнер работает, у него вываливается подобное
> сообщение, а я код правил у меня пол модуля переписано,
> и эта строчка давно уже не 430.... Мне лезть в репозиторий,
>  доставать старую версию, смотреть ошибку, возвращать новую
> версию, править ее.
> Если же у меня написано в Ассерте: "бла-бла-бла TextureLib.
> pas line 430 BitCount == 24" я сразу знаю что это, сразу
> лезу и правлю текстуру, без всякого кода. Вот что в моем
> понимании "действительно Assert"


Еще один программист без кнопки F1 на клавиатуре. Где только такие клавиатуры покупают ?


 
Igorek ©   (2007-08-01 11:43) [21]


> Sandman29 ©   (01.08.07 09:27) [19]

Спасибо, протупил.



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

Форум: "Прочее";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.05 c
10-1135338727
Bleed
2005-12-23 14:52
2007.08.26
Методы и Свойства COM объекта


6-1168336140
Ш-К
2007-01-09 12:49
2007.08.26
Как вставить картинку в TWebBrowser из памяти.


4-1173271734
tytus
2007-03-07 15:48
2007.08.26
Как получить доступ к уже открытому текст. файлу


15-1185782087
TStas
2007-07-30 11:54
2007.08.26
Не планируется ли ММП?


15-1185305637
Vivid
2007-07-24 23:33
2007.08.26
Посоветуйте программу для заметок





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