Форум: "Прочее";
Текущий архив: 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.045 c