-
Есть свойство типа запись {$M+} //Это я написал, чтоб RTTI создать type TWinPos = record Top, Left, Width, Height: Integer; end; {$M-}
пишу к нему редактор свойства, вот его процедура регистрации:
procedure Register; begin RegisterPropertyEditor(TypeInfo(TWinPos), {А здесь компилятор грязно ругается, говорит, что у WinPos нету TypeInfo} TstHTMLText, 'WinPos', THTMLTextProperty) end;
И как заставить TypeInfo появиться? И второе: при присвоении SetOrdValue?
-
Насколько помню, для записей RTTI не генерится, а опция {$M+} работает только для классов.
-
>Юрий Зотов Т. е., как я и думал, переделать запись в класс? Точнее, создать type TWinPosition = class WinPos: TWinPos end; А там в конце объявления класса надо директиву М выключать или нет? Просто я только потом сообразил, что для записи я все равно не смогу установить значение свойства.
-
type
TWinPos = class(TPersistent)
private
FRect: TRect;
function GetRectValue(Index: integer); integer;
procedure SetRectValue(Index: integer; Value: integer);
public
constructor Create(AOwner: TPersistent); override;
published
property Top: integer index 0 read GetRectValue write SetRectValue;
property Left: integer index 1 read GetRectValue write SetRectValue;
property Width: integer index 2 read GetRectValue write SetRectValue;
property Height: integer index 3 read GetRectValue write SetRectValue;
end;
constructor TWinPos.Create(AOwner: TPersistent);
begin
FRect := Rect(0,0,0,0);
end;
function TWinPos.GetRectValue(Index: integer); integer;
begin
Result := 0;
case index of
0: Result := fRect.Top;
1: Result := fRect.Left;
2: Result := fRect.Right;
3: Result := fRect.Bottom;
end;
end;
procedure TWinPos.SetRectValue(Index: integer; Value: integer);
begin
If Value = GetRectValue(Index) then Exit;
case Index of
0: fRect.Top := Value;
1: fRect.Left := Value;
2: fRect.Right = Value;
3: fRect.Bottom := Value;
end;
end;
-
DimaBr (17.01.07 11:49) [3] function TWinPos.GetRectValue(Index: integer); integer; begin Result := 0; case index of 0: Result := fRect.Top; 1: Result := fRect.Left; 2: Result := fRect.Right; 3: Result := fRect.Bottom; end;{case} end;
procedure TWinPos.SetRectValue(Index: integer; Value: integer); begin If Value = GetRectValue(Index) then Exit; case Index of 0: fRect.Top := Value; 1: fRect.Left := Value; 2: fRect.Right = Value; 3: fRect.Bottom := Value; end;{case} end;Зачем же так жестко?? ;-) property Top: integer read FRect.Top write FRect.Top; и далее по списку...
-
> jack128 © (17.01.07 12:34) [4]
Думаю что OnChange захочется непременно !!!!
-
Я попытался создать класс, наследник TPersistent и к нему приделать эту запись. Все хорошо: и редактор св-ва чудесно работает, и св-во присваивается, кроме одного - в dfm оно категорически не сохраняется. А почему-непонятно. TPersistent же умеет сохраняться в в dfm
-
> TStas © (17.01.07 17:32) [6]
Видя код, отвечать было бы гораздо легче... :o)
-
Я проблемку решил, компонент дописал. Почему не сохранялось примерно понял. Но код покажу затра. Спасибо всем.
-
>Юрий Зотов Будет настроение, посмотрите компонентик http://stas258.narod.ru/frame/download/HTMLText.zipЭто наследник TGraphicControl который несложный html понимает и дает возможнось по ссылкам браузер ии почтовую программу открывать и сохранять ссылки как ярлыки и т. д. Центральное св-во htmlText. Есть редакторы свойств. Компонентную справку не написал, много работы очень. Текст переносит по словам по возможности. В редакторе св-ва есть подсказка по html'у, который компонент понимает. Мне Ваше мнение очень интересно.
-
> TStas © (20.01.07 02:37) [9]
Я, конечно, не Юрий Зотов :) Но, если можно, несколько комментов: Во-1вых, не надо было в архив *.~* кидать :) const
crRefHand = 7777; Так есть же уже - crHandPoint = TCursor(-21), зачем свой? Хорошо, если бы при наведении на ссылку хинт показывался б с адресом, если title не укзан, он у меня, кстати, не пашет! Просто замечание по коду: p^.Lexeme := LexemeRec.Lexeme;
p^.Text := LexemeRec.Text;
p^.hRef := LexemeRec.hRef;
p^.Title := LexemeRec.Title; - "p^." эквивалентно "p.", зачем писать первое? :) Я бы так не злоупотреблял exit, это же безусловный выход, а он у тебя часто "подменяет" ветвление, но это только моё мнение - все мы мыслим по разному, но else проще воспринимать: видно, какие блоки участвуют в ветвлении, а так нужно постоянно следить, чтобы где-нибудь exit не проскочил - структурность хереет. Ещё у тебя есть избыточность в коде, например,
if FText[Fp] = #39 then Quote := #39
else Quote := '\"';
проще:
Quote := FText[Fp];
Или методы IsXXX - большую часть кода из них можно было обощить (по крайней мере b i u, точно).... Вообще, кул! Freeware?
-
Позволю себе тоже покритиковать, что сразу в глаза бросилось: 1. unit MenuItems; procedure CreateShortcut(const URL, Title: String);
var
OpenDialog: TOpenDialog;
begin
OpenDialog := TOpenDialog.Create(Application);
Раз уж мы выделили ресурс, надо бы уверится, что он потом освободится
try
OpenDialog.DefaultExt := 'lnk';
OpenDialog.Filter := 'Ярлыки|*.lnk';
OpenDialog.FilterIndex := 0;
OpenDialog.Title := 'Сохранить ярлык как...';
OpenDialog.FileName := Title+'.lnk';
If OpenDialog.Execute then
CreateShortcut_(CorrectURL(URL), '', '', OpenDialog.FileName);
finally
OpenDialog.Free;
end;end; аналогично, в модуле SimpleHTMLParser function TCharList.GetAsText: String;
var
List: TstringList;
CharRec: TCharRec;
i: Integer;
s: String;
begin
List := TstringList.Create;
try
If Count > 0 then
for i:=0 to Count-1 do
begin
CharRec := Records[i];
s := '['+IntToStr(i)+'] «'+CharRec.AChar+'»';
If CharRec.Bold then s:=s+' bold';
If CharRec.Italic then s:=s+' Italic';
If CharRec.Underline then s:=s+' Underline';
If CharRec.OfHref then s:=s+' OfHref';
List.Add(s);
end;
Result := List.Text;
finally
List.Free;
end;
end; Да и так везде должно быть. Так же, надо поступать и в случае BeginUpdates и EndUpdates у TStringList и т.п. Далее, поскольку TstHTMLText не TWinControl он не может быть DoubleBuffered. И по уму рисование в TstHTMLText.Paint надо делать на витмап в пямяти и потом его копировать на Canvas. Это чтобы не моргало никогда.
-
это.. Ты не боишься, что поклонники мазилы, оперы и тд тебя побъют?? Ссылки браузером по умолчанию лудше открывать. Через ShellExecute
-
>ors_archangel Насчет курсора: мне не очень crHandPoint нравится - не красивый он. "p^." эквивалентно "p.", зачем писать первое? Мне так самому понятнее. Про похожие функции, честно говоря парсер драл из своего старого проекта и в лом обобщать было. Freeware? - Конечно! А про тильду, не знаю, как просмотрел, наверно, с последней компиляции осталась.
if FText[Fp] = #39 then Quote := #39 else Quote := '"'; проще: Quote := FText[Fp]; //Согласен, и правда проще. С exit'ами я так привык, а то иногда очень вложенные if'ы получаются. >Макс Черных Спасибо за замечание о неосвобождении памяти. Вообще-то я только так всегда и делаю (Free стазу пиши:)) >jack128 Жень, я просто ему св-во придумал BrowserStyler да и IE везде же есть. Может, еще одно св-во приделать? UseIE? А так все спасибо большое :) Я этот компонент и затеял, чтобы спасибы писать:) >Макс Черных Я, где надо перерисовывать много, на битмапе и рисую сначала. Просто конмонент перерисовывает ссылки только один раз при неодходимости. У него на это специальное св-во внутреннее есть. У меня он не мигал. Неужели у Вас мигает?
-
> Неужели у Вас мигает?
Да я и не запускал. :)
> Просто конмонент перерисовывает ссылки только один раз при > неодходимости. У него на это специальное св-во внутреннее > есть.
Я в логику компонента не вникал, тем не менее хорошим тоном является всегда рисовать на временный битмап, кроме совсем простых случаев.
-
>Макс Черных Так это и есть самый простой случай. Он или весь перерисовывается, или перекрашивается текст один раз при движениии мышки
-
> Так это и есть самый простой случай.
Ну тогда, пожалуй, и без временного битмапа обойдется :)
|