Конференция "Компоненты" » Не создается TypeInfo
 
  • TStas © (16.01.07 23:44) [0]
    Есть свойство типа запись
    {$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?
  • Юрий Зотов © (17.01.07 00:38) [1]
    Насколько помню, для записей RTTI не генерится, а опция {$M+} работает только для классов.
  • TStas © (17.01.07 09:54) [2]
    >Юрий Зотов Т. е., как я и думал, переделать запись в класс? Точнее, создать type TWinPosition = class WinPos: TWinPos end;
    А там в конце объявления класса надо директиву М выключать или нет? Просто я только потом сообразил, что для записи я все равно не смогу установить значение свойства.
  • DimaBr (17.01.07 11:49) [3]

    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;{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;

  • jack128 © (17.01.07 12:34) [4]
    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;

     и далее по списку...
  • DimaBr (17.01.07 12:48) [5]

    > jack128 ©   (17.01.07 12:34) [4]

    Думаю что OnChange захочется непременно !!!!
  • TStas © (17.01.07 17:32) [6]
    Я попытался создать класс, наследник TPersistent и к нему приделать эту запись. Все хорошо: и редактор св-ва чудесно работает, и св-во присваивается, кроме одного - в dfm оно категорически не сохраняется. А почему-непонятно. TPersistent же умеет сохраняться в в dfm
  • Юрий Зотов © (17.01.07 18:00) [7]
    > TStas ©   (17.01.07 17:32) [6]

    Видя код, отвечать было бы гораздо легче...
    :o)
  • TStas © (17.01.07 23:09) [8]
    Я проблемку решил, компонент дописал. Почему не сохранялось примерно понял. Но код покажу затра. Спасибо всем.
  • TStas © (20.01.07 02:37) [9]
    >Юрий Зотов Будет настроение, посмотрите компонентик http://stas258.narod.ru/frame/download/HTMLText.zip
    Это наследник TGraphicControl который несложный html понимает и дает возможнось по ссылкам браузер ии почтовую программу открывать и сохранять ссылки как ярлыки и т. д. Центральное св-во htmlText. Есть редакторы свойств. Компонентную справку не написал, много работы очень. Текст переносит по словам по возможности. В редакторе св-ва есть подсказка по html'у, который компонент понимает. Мне Ваше мнение очень интересно.
  • ors_archangel © (20.01.07 04:23) [10]

    > 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?
  • Макс Черных © (20.01.07 19:21) [11]
    Позволю себе тоже покритиковать, что сразу в глаза бросилось:

    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. Это чтобы не моргало никогда.
  • jack128 © (20.01.07 22:42) [12]
    это.. Ты не боишься, что поклонники мазилы, оперы и тд тебя побъют?? Ссылки браузером по умолчанию лудше открывать.  Через ShellExecute
  • TStas © (20.01.07 23:26) [13]
    >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?
    А так все спасибо большое :)
    Я этот компонент и затеял, чтобы спасибы писать:)
    >Макс Черных Я, где надо перерисовывать много, на битмапе и рисую сначала. Просто конмонент перерисовывает ссылки только один раз при неодходимости. У него на это специальное св-во внутреннее есть. У меня он не мигал. Неужели у Вас мигает?
  • Макс Черных © (21.01.07 00:03) [14]

    > Неужели у Вас мигает?


    Да я и не запускал. :)


    > Просто конмонент перерисовывает ссылки только один раз при
    > неодходимости. У него на это специальное св-во внутреннее
    > есть.

    Я в логику компонента не вникал, тем не менее хорошим тоном является  всегда рисовать на временный битмап, кроме совсем простых случаев.
  • TStas © (23.01.07 20:06) [15]
    >Макс Черных Так это и есть самый простой случай. Он или весь перерисовывается, или перекрашивается текст один раз при движениии мышки
  • Макс Черных © (25.01.07 01:38) [16]

    > Так это и есть самый простой случай.

    Ну тогда, пожалуй, и без временного битмапа обойдется :)
 
Конференция "Компоненты" » Не создается TypeInfo
Есть новые Нет новых   [119207   +18][b:0][p:0.003]