Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigenschaft existiert nicht?! (https://www.delphipraxis.net/1274-eigenschaft-existiert-nicht.html)

phlux 8. Nov 2002 18:54


Eigenschaft existiert nicht?!
 
Hallo!
Folgendes problem, ich schreib momentan eine Komponente, sieht imoment wie folgt aus:
Code:
unit SimpleFileView;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls;

type
  TSimpleFileView = class(TCustomListView)
  private
    { Private-Deklarationen }
    fPath: String;
    procedure SetPath(Path: String);
    procedure ListDirectory(Dir: String);
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(aOwner: TComponent); override;
  published
    { Published-Deklarationen }
    property Path: String read fPath write SetPath;
    property Align;
    property BorderStyle;
    property Color;
    property Ctl3D;
    property ColumnClick default False;
    property Columns;
    property Cursor;
    property Dragmode;
    property DragCursor;
    property Enabled;
    property Font;
    property Height;
    property HideSelection default False;
    property Hint;
    property IconOptions;
    property Items;
    property Left;
    property MultiSelect default False;
    property Name;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ReadOnly default False;
    property ShowColumnHeaders default True;
    property ShowHint;
    property TabOrder;
    property TabStop;
    property Tag;
    property Top;
    property ViewStyle default vsReport;
    property Visible;
    property Width;
    property OnChange;
    property OnChanging;
    property OnClick;
    property OnColumnClick;
    property OnCompare;
    property OnDblClick;
    property OnDeletion;
    property OnDragDrop;
    property OnDragOver;
    property OnEdited;
    property OnEditing;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnInsert;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDrag;
{$IFDEF D3_OR_HIGHER}
    property HotTrack;
    property RowSelect default False;
{$ENDIF}
{$IFDEF D4_OR_HIGHER}
    property Anchors;
    property BiDiMode;
    property Constraints;
    property HotTrackStyles;
{$ENDIF}
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('CR-Soft', [TSimpleFileView]);
end;

constructor TSimpleFileView.Create(aOwner: TComponent);
var Column: TListColumn;

begin
  inherited Create(aOwner);
  ViewStyle := vsReport;
  RowSelect := True;
  ReadOnly := True;
  Column := Columns.Add;
  Column.Caption := 'Dateiname';
  Column.Width := Width - 30;
  IconOptions.WrapText := True;
  ColumnClick := False;
  If not (csDesigning in ComponentState) then
    ListDirectory(fPath);
end;

procedure TSimpleFileView.ListDirectory(Dir: String);
var
  Search: TSearchRec;
  Item: TListItem;

begin
  Items.Clear;
  If Dir[Length(Dir)] <> '\' then Dir := Dir + '\';
  if FindFirst(Dir + '*.*', faDirectory, Search) = 0 then
  begin
    repeat
      If ((Search.Attr AND faDirectory) = faDirectory) AND (Search.Name <> '.') then
      begin
        Item := Items.Add;
//        if fBrackets then
          Item.Caption := '['+Search.Name+']'
//        else
//          Item.Caption := Search.Name;
      end;
    until FindNext(Search) <> 0;
    FindClose(Search);
  end;
  if FindFirst(Dir + '*.*', $23, Search) = 0 then
  begin
    repeat
      If (Search.Attr <> faDirectory) then
      begin
        Item := Items.Add;
        Item.Caption := Search.Name
//          Item.Caption := Copy(ExtractFileName(Search.Name), 1, Length(ExtractFileName(Search.Name)) - 4);
      end;
    until FindNext(Search) <> 0;
    FindClose(Search);
  end;
end;

procedure TSimpleFileView.SetPath(Path: String);
begin
  if fPath <> Path then fPath := Path;
  if not (csDesigning in ComponentState) then
    ListDirectory(fPath);
end;

end.
Wenn ich jedoch jetzt die Kompo installiere (ist zwar noch nicht 100%ig fertig, nur zum testen) und in die Property Path z.B.: C:\ eintrage erhalte ich eine FehlerMsg, die sagt: Eigenschaft existiert nicht, wenn ich jetzt versuche die Property über den sourcecode anzusprechen wird sie erst gar nicht mehr angezeigt in dem dropdown fenster(das sich nach ner weile nach dem . öffnet, ka wie man das nennt). Hatte jemand von euch schon mal das Problem und kennt eine Lösung???

mfg phlux

jbg 8. Nov 2002 22:28

Kann es sein, dass du mit 2 SimpleFileView.dcu Dateien arbeitest, einer alten und einer neuen?

Christian Seehase 9. Nov 2002 01:13

Moin Phlux,

also mit einer kleinen Ausnahme tut's Deine Kompo bei mir.
Den genannten Fehler kann ich nicht nachvollziehen.

Nur das

Delphi-Quellcode:
If not (csDesigning in ComponentState) then
    ListDirectory(fPath);
im constructor wird nicht funktionieren (bzw. tuts nicht) da zu diesem Zeitpunkt fPath noch nicht gesetzt ist.
Was auch garnicht notwendig ist, denn sollte Path im OI gesetzt worden sein, so wird bei der Initialisierung dieser Wert aus der Formularresource ausgelesen und in Path gesetzt. Da hierfür ja die Routine SetPath verwendet wird, wird ListDirectory in dieser Routine ausgeführt.

phlux 9. Nov 2002 11:39

@jbg: hab jetzt mal zur sicherheit die dcu datei aus dem lib verzeichniss gelöscht, mal schaun

@chris: jepp, danke scheint mir entfallen zu sein ;), nur wenn ich jetzt fPath im Constructor setze und if csDesigning... rausnehme kommt nur die nachricht " Element '' hat kein übergeordnetes Fenster ", ich versuch jetzt mal ne kombinatio aus beidem.

Der sh** Fehler besteht aber immer noch, ich glaub ich fang die Kompo mit anderem Namen nochmal neu an! War ja noch nicht soviel :(

CalganX 9. Nov 2002 11:51

Ich kenne mich mit der Komponentenentwicklung so gut wie überhaupt nicht aus, aber versuch es mal so: Schreibe jede Variable/Property/Funkion, die eine Instanz der Kompo ist so:
Code:
self.Eigenschaft := Irgendwas;
self.Variable := self.Eigenschaft;
Chris

phlux 9. Nov 2002 12:14

Zitat:

Zitat von Chakotay1308
Ich kenne mich mit der Komponentenentwicklung so gut wie überhaupt nicht aus, aber versuch es mal so: Schreibe jede Variable/Property/Funkion, die eine Instanz der Kompo ist so:
Code:
self.Eigenschaft := Irgendwas;
self.Variable := self.Eigenschaft;
Chris

Wenn ich die Kompo schreibe kann ich ja drauf zugreifen, nur wenn ich die Kompo installiere konnte ich nicht mehr drauf zugreifen, aber das Problem wurde durch umbenennen der Unit gelöst :P

Christian Seehase 9. Nov 2002 12:16

Moin Phlux,

ich hatte nur die beiden genannten Zeilen weggelassen, und die Kompo hat ansonsten keine Probleme gemacht.

phlux 9. Nov 2002 15:08

Das einzige Problem ist jetzt noch, wenn ich im Constructor ListDirectory(fPath) ausführe, meckert Delphi das : Element " hat kein übergeordnetes Fenster! Habe es auch schon ausprobiert in der Prozedur Loaded und CreateWnd die Prozedur ListDirectory auszuführen, haut aber immer noch nicht hin :(

Christian Seehase 9. Nov 2002 22:08

Moin Phlux,

mit was soll ListDirectory denn im Constructor aufgerufen werden?

Der Pfad, der im OI gesetzt wird steht noch nicht zur Verfügung, so dass Du einen Standardpfad angeben musst, z.B. aus paramstr(0) extrahiert.

Was mir auch nicht klar ist:
Wozu soll ListDirectory im Constructor aufgerufen werden?
Wird Pfad im OI nicht gesetzt wird, völlig korrekt, nichts angezeigt.
Wird der Pfad dort gesetzt, so wird auch das angezeigt, was im OI gesetzt wurde.

phlux 10. Nov 2002 10:43

Zitat:

Zitat von Christian Seehase
Moin Phlux,

mit was soll ListDirectory denn im Constructor aufgerufen werden?

Mit irgend einem Standartpfad, ist irgendwie blöd, wenn man zur Designzeit nur ein leeres Feld vor sich sieht :(

Zitat:

Der Pfad, der im OI gesetzt wird steht noch nicht zur Verfügung, so dass Du einen Standardpfad angeben musst, z.B. aus paramstr(0) extrahiert.
Das ist eine gute idee, das versuch ich nacher mal :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz