[Delphi 7] Welke property editor is dit?

Pagina: 1
Acties:
  • 140 views sinds 30-01-2008
  • Reageer

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:26

Tomatoman

Fulltime prutser

Topicstarter
Afbeeldingslocatie: http://img339.imageshack.us/img339/4489/propedit6gl.jpg

Wie weet hoe de weergegeven property editor voor de ImageIndex property heet en in welke unit hij gedefinieerd is? Ik kan hem nergens vinden in de Delphi source files, ook niet in DesignEditors.pas :/

Een goede grap mag vrienden kosten.


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

TComponentImageIndexPropertyEditor :)
Er kan er natuurlijk ook zelf property editor voor maken, zoek eens naar RegisterPropertyEditor(). Ohja, kijk ook naar TChangeLink of TImagelistLink. Naja, zoiets in die trant O-)

[ Voor 88% gewijzigd door alienfruit op 17-07-2005 04:00 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:26

Tomatoman

Fulltime prutser

Topicstarter
alienfruit schreef op zondag 17 juli 2005 @ 03:42:
TComponentImageIndexPropertyEditor :)
Er kan er natuurlijk ook zelf property editor voor maken, zoek eens naar RegisterPropertyEditor(). Ohja, kijk ook naar TChangeLink of TImagelistLink. Naja, zoiets in die trant O-)
Kijk, nu komen we ergens :). Weet je ook in welke unit hij gedeclareerd is en/of in welk design-time package hij zit? De meeste property editors heten trouwens TxxxxxProperty, kan het zijn dat deze property editor TComponentImageIndexProperty heet?

De TChangeLink had ik gisteren al geïmplementeerd, wijzigingen in de image list worden netjes afgevangen. Afbeeldingslocatie: http://images.fok.nl/s/static.gif

Een goede grap mag vrienden kosten.


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Volgens dclstd70.map in dclstdXX.dpl
Oftewel StdReg toevoegen aan je unit clause en vervolgens zeg je dat dclstd70.dcp is required bij je design time package. Volgens mij moet het zo werken, alweer een tijdje niet gedaan :)

[ Voor 71% gewijzigd door alienfruit op 17-07-2005 15:11 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:26

Tomatoman

Fulltime prutser

Topicstarter
Dankjewel, ik ben weer een stap verder :). Echter, het wil maar niet lukken om TPersistentImageIndexPropertyEditor of TComponentImageIndexPropertyEditor te overerven. Ik heb ongeveer alle units die in dclstdd70.map worden genoemd toegevoegd aan mijn uses clause en ik blijf de melding krijgen dat TPersistentImageIndexPropertyEditor een undeclared identifier is. Als ik een andere willekeurige component uit dclstdd70.map overerf, gaat alles goed.

Zou het kunnen dat TPersistentImageIndexPropertyEditor en TComponentImageIndexPropertyEditor sinds Delphi 6 naar vanuit de interface sectie van StdReg zijn verhuisd naar de implementation sectie?

Verder kwam ik via Google bij http://www.backslash.com.au/products/bcb5-book/chapter02/ uit. Ik heb inmiddels ontdekt dat ImageIndex van het type TImageIndex moet zijn en ImageList van het type TCustomImageList. Nu zie ik inderdaad een dropdown list bij de ImageList property verschijnen, alleen blijft hij leeg. Dat is volgens die link ook logisch, want er staat:
The TPersistentImageIndexPropertyEditor is for TImageIndex properties in classes that descend from TPersistent (but not TComponent) with a parent component that has a TCustomImageList* property with the name Images.
Bij mij zijn de ImageIndex en Images property allebei gedefinieerd in een TPersistent object, dat als parent een ander TPersistent object heeft. Conclusie: ik moet een descendant van TPersistentImageIndexPropertyEditor maken maar dan moet ik wel weten waar hij is gedeclareerd.

Een goede grap mag vrienden kosten.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:26

Tomatoman

Fulltime prutser

Topicstarter
Bij gebrek aan een bestaande property editor die ik kan overriden heb ik er zelf maar een geschreven. Hij is niet van echt te onderscheiden :P. Om het topic af te sluiten zet ik hier voor de geïnteresseerden de code.

TTextBullet is een TPersistent descendant en heeft twee relevante properties: ImageIndex (type: TImageIndex) en Images (type: TCustomImageList). De parent van TTextBullet is irrelevant.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
unit MijnPropertyEditorReg;

interface

uses
  Classes, Types, SysUtils, Graphics, Math, ImgList, DesignIntf, DesignEditors,
  VCLEditors, TypInfo, MijnTTextBulletUnit;

type
  { TTextBulletImageIndexProperty shows a dropdown list with images for the
    ImageIndex property of TTextBullet. It works similar to
    TPersistentImageIndexPropertyEditor, which is declared in the implementation
    section of StdReg.pas (package dclstd). }

  TTextBulletImageIndexProperty = class(TIntegerProperty,
    ICustomPropertyListDrawing)
  private
    procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas;
      var AWidth: Integer);
    procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas;
      var AHeight: Integer);
    procedure ListDrawValue(const Value: string; ACanvas: TCanvas;
      const ARect: TRect; ASelected: Boolean);
  public
    function GetAttributes: TPropertyAttributes; override;
    function GetImageListAt(Index: Integer): TCustomImageList; virtual;
    procedure GetValues(Proc: TGetStrProc); override;
  end;

procedure Register;

implementation

procedure TTextBulletImageIndexProperty.ListMeasureHeight(const Value: string;
  ACanvas: TCanvas; var AHeight: Integer);
var
  ImgList: TCustomImageList;
begin
  ImgList := GetImageListAt(0);
  AHeight := ACanvas.TextHeight(Value) + 2;
  if Assigned(ImgList) then
    AHeight := Max(AHeight, ImgList.Height + 4);
end;

procedure TTextBulletImageIndexProperty.ListMeasureWidth(const Value: string;
  ACanvas: TCanvas; var AWidth: Integer);
var
  ImgList: TCustomImageList;
begin
  ImgList := GetImageListAt(0);
  AWidth := ACanvas.TextWidth(Value) + 4;
  if Assigned(ImgList) then
    AWidth := Max(AWidth, ImgList.Width + 4);
end;

procedure TTextBulletImageIndexProperty.ListDrawValue(const Value: string;
  ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
var
  ImgList: TCustomImageList;
  R: TRect;
begin
  ImgList := GetImageListAt(0);
  ACanvas.FillRect(ARect);
  R := ARect;
  Inc(R.Left, 2);
  if Assigned(ImgList) then
  begin
    ImgList.Draw(ACanvas, R.Left, R.Top + 2, StrToInt(Value));
    Inc(R.Left, ImgList.Width + 2);
  end;
  DefaultPropertyListDrawValue(Value, ACanvas, R, ASelected);
end;

function TTextBulletImageIndexProperty.GetAttributes: TPropertyAttributes;
begin
  Result := [paMultiSelect, paValueList, paRevertable];
end;

function TTextBulletImageIndexProperty.GetImageListAt(Index: Integer):
  TCustomImageList;
var
  APersistent: TPersistent;
begin
  APersistent := GetComponent(Index);
  if APersistent is TTextBullet then
    Result := TTextBullet(APersistent).Images
  else
    Result := nil;
end;

procedure TTextBulletImageIndexProperty.GetValues(Proc: TGetStrProc);
var
  ImgList: TCustomImageList;
  i: Integer;
begin
  ImgList := GetImageListAt(0);
  if Assigned(ImgList) then
    for i := 0 to ImgList.Count - 1 do
      Proc(IntToStr(i));
end;

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(TImageIndex), TTextBullet, '',
    TTextBulletImageIndexProperty);
end;
Het eindresultaat:

Afbeeldingslocatie: http://img267.imageshack.us/img267/4048/list4xu.jpg

Een goede grap mag vrienden kosten.


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Erg aardig! Wel jammer, dat je niet de property editor kan wijzigen. Toch eens vragen aan de IDE/OpenTools man bij het Delphi Team. Nu wil ik het weten ook :+

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:26

Tomatoman

Fulltime prutser

Topicstarter
Ik ben benieuwd. :)

Een goede grap mag vrienden kosten.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Het is meerdere mensen niet gelukt. JVCL heeft bijvoorbeeld ook maar een eigen gebouwd.

We adore chaos because we like to restore order - M.C. Escher


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Ooh dan... Naja, ik ga maar even verder met mijn Avalon voorbeeld. Wat een prut is dat nog zonder Avalon designer in VS2005 :( Klaor! Leuk dat Avalon maar niet nu, mijn XAML ziet er toch heerlijk uit... durf het alleen niet op te schonen (misschien gaat ie weer stuk)

[ Voor 40% gewijzigd door alienfruit op 19-07-2005 19:56 ]

Pagina: 1