Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.26;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.023 c
4-1173057637
Непонятливый
2007-03-05 04:20
2007.08.26
Как из D7 изменить права доступа к файлу/каталогу в Vista/XP?


15-1185460867
БарЛог
2007-07-26 18:41
2007.08.26
Книга по строению автомобиля "для чайников"


15-1185293461
Slimer
2007-07-24 20:11
2007.08.26
Джойстик вместо мыши


2-1186060016
JanMihail
2007-08-02 17:06
2007.08.26
Как высвободить память занимаемую TWebBrowser ом


15-1185339334
dimaL
2007-07-25 08:55
2007.08.26
Формы в DLL