Delphi-PRAXiS

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 Eingaben im Objektinspektor prüfen (https://www.delphipraxis.net/78929-eingaben-im-objektinspektor-pruefen.html)

messie 13. Okt 2006 10:10


Eingaben im Objektinspektor prüfen
 
Moin,

ich bastle mir gerade die TFormResizer-Kompo von kalmi01 für meine Zwecke zurecht, dabei habe ich eine Menge Zeit verschenkt, weil ich im Objektinspektor einen unsinnigen Wert eingegeben hatte.
Wie kann ich die Werte bei der Eingabe prüfen?

Grüße, Messie

mkinzler 13. Okt 2006 10:12

Re: Eingaben im Objektinspektor prüfen
 
In der Setter-Methode der Property bzw. im passenden PropertyEditor

messie 13. Okt 2006 10:22

Re: Eingaben im Objektinspektor prüfen
 
Zitat:

Zitat von mkinzler
In der Setter-Methode der Property bzw. im passenden PropertyEditor

Damit kann ich noch nicht viel anfangen. Ich brauche also eine Routine, die zur Entwurfszeit benutzt wird. Wie sieht die aus? Reicht es, eine Routine zu schreiben und dann die Kompo neu zu installieren?

Grüße, Messie

messie 16. Okt 2006 19:17

Re: Eingaben im Objektinspektor prüfen
 
...ich würde das gerne noch verstehen. Hat noch jemand ein Beispiel oder ein paar warme Worte?

Grüße, Messie

mkinzler 16. Okt 2006 19:34

Re: Eingaben im Objektinspektor prüfen
 
Delphi-Quellcode:
TPerson = class
  private
    FGeburttag: TDate;
  public
    procedure setGeburttag( Value: TDate);
    function getAlter: Byte;
  published
    property Geburtstag: Tdate read FGeburttag write setGeburtstag;
    property Alter: Byte read getAlter;
end;

procedure TPerson.setGeburttag( Value: TDate);
begin
    if Value < date() then
    begin
      FGeburttag := Value;
    end
    else
    begin
     //Fehlerausgabe
    end;
end;

function TPerson.getAlter: Byte;
var
    d,m,y: Word;
begin
    Decodedate( Date()-FGeburttag, y, m, d);
    result := y;
end;

messie 16. Okt 2006 19:50

Re: Eingaben im Objektinspektor prüfen
 
noch mal zur Sicherheit, bevor ich es nochmal ausprobiere (beim ersten Mal hat es nicht geklappt):
die "normalen" Prozeduren zum Setzen der property werden nach einem Register auch zur Entwurfszeit ausgeführt?

Grüße, Messie

mkinzler 16. Okt 2006 20:04

Re: Eingaben im Objektinspektor prüfen
 
Ja.

idefix2 12. Jul 2015 22:45

AW: Eingaben im Objektinspektor prüfen
 
Zitat:

Zitat von messie (Beitrag 538902)
noch mal zur Sicherheit, bevor ich es nochmal ausprobiere (beim ersten Mal hat es nicht geklappt):
die "normalen" Prozeduren zum Setzen der property werden nach einem Register auch zur Entwurfszeit ausgeführt?

Zitat:

Zitat von mkinzler (Beitrag 538910)
Ja.

Irgendwie klappt das bei mir nicht.
Ich bin dabei, eine eigene Komponente von TEdit abzuleiten. Die soll (ähnlich wie TLabelledEdit) auch eine Caption bekommen, und das funktioniert im Design-Mode überhaupt nicht. Ich habe jetzt im Setter eine Kontrollmeldung ausgegeben, und auch die wird nur zur Laufzeit beim Formcreate angezeigt, aber nicht, wenn ich die Eigenschaft im Object-Inspector ändere. Was ist da falsch?

Delphi-Quellcode:
TLabelPosition = (ptAbove, ptLeft, ptRight, ptBelow);

TfdEdit = Class(TEdit,IfdComponent)
  private
  FCaption: String;
  FCaptionPosition: TLabelPosition;
  FCaptionFont: TFont;
  FCaptionDistance: Integer;
  ...
  procedure SetLabelProperties;
  procedure SetLabelCaption(const value: string);
  procedure SetLabelFont(value: TFont);
  procedure SetLabelDistance(value: integer);
  ...
  published
  property Caption: string read FCaption write SetLabelCaption;
  property CaptionFont: TFont read FCaptionFont write SetLabelFont;
  property CaptionDistance: integer read FCaptionDistance write SetLabelDistance;
  End;

procedure TfdEdit.SetLabelProperties;
begin
if not assigned(FLabel) then exit;
Flabel.Caption:=FCaption;
if assigned(FCaptionFont) then FLabel.Font:=FCaptionfont;
case FCaptionPosition of
   ptAbove: begin FLabel.Left:=Left; FLabel.Top:=Top-FLabel.Height-FCaptionDistance end;
   ptLeft: begin FLabel.Left:=Left-FCaptionDistance-FLabel.Width; Flabel.Top:=Top+(Height-Flabel.Height) div 2 end;
   ptRight: begin FLabel.Left:=Left+FCaptionDistance+Width; Flabel.Top:=Top+(Height-Flabel.Height) div 2 end;
   ptBelow: begin FLabel.Left:=Left; FLabel.Top:=Top+Height+FCaptionDistance end;
   end (* case *);
end;

procedure TfdEdit.SetLabelCaption(const value: string);
begin
  FCaption:=value;
  Showmessage('Label: '+Value);
  if value='' then
    begin
    if assigned(FLabel) then FLabel.Free;
    exit
    end;
  if not assigned(FLabel) then
    begin
    FLabel:=TLabel.Create(Self);
    FLabel.Parent:=Parent
    end;
  SetLabelProperties;
end;
Wenn ich das Programm starte, wird Showmessage ausgeführt, und das Editfeld samt des Caption-Labels richtig angezeigt.
Aber wenn ich im OI die Eigenschaft Caption ändere, hat das keine sichtbare Auswirkung, es wird weder das Showmessage noch der Label angezeigt.

Das Setzen der CaptionFont im OI ist übrigens auch nicht möglich. Die Property wird im OI angezeigt, aber wenn ich die drei Punkte anklicke, kommt die Fehlermeldung:
Zitat:

nil kann nicht zu TFont zugewiesen werden.
obwohl ich im Konstruktor von TfdEdit den Wert CaptionFont mit self.font initialisiert habe.

stahli 12. Jul 2015 22:54

AW: Eingaben im Objektinspektor prüfen
 
Bevor sich jemand mit den Details befasst: Installierst Du das Package auch neu?
Sonst wird zur Laufzeit die neue Version genutzt, die IDE nutzt aber noch die alte (die vielleicht noch nicht auf die Änderungen reagiert).

idefix2 12. Jul 2015 23:03

AW: Eingaben im Objektinspektor prüfen
 
AAAhhhh!
Das heisst, dass ich nach jeder Komponentenänderung das Package neu installieren muss, damit die Änderungen sichtbar sind?
Das macht aber die Entwicklung von Komponenten zu einem leicht getrübten Vergnügen :)

Werde das Package jetzt neu installieren und dann berichten, ob das geholfen hat.

idefix2 12. Jul 2015 23:38

AW: Eingaben im Objektinspektor prüfen
 
Ja, das wars.

Ich hatte die Komponenten ins Testprojekt eingebunden, und das bekommt die IDe offenbar nicht mit.
Ich glaube (hoffe), es genügt, wenn man das Package selbst neu erzeugt, das dürfte sich dann automatisch in der IDE installieren. Das Deinstallieren des alten Package war jedenfalls reichlich aufwändig (Jede Menge "Ausnahmeverletzungen" beim Entfernen des Packages), und hat mir die Komponente auf dem Formular des Testprojekts rausfliegen lassen.

stahli 12. Jul 2015 23:47

AW: Eingaben im Objektinspektor prüfen
 
Ich weiß nicht, wie es bei D2009 war (das nutzt Du?).

Zumindest mit neueren Versionen muss man ein Package nicht deinstallieren. Einfach Rechtsklick und installieren reicht eigentlich aus.
Dazu werden offene Formulare geschlossen, damit die Komponenten nicht aus der DFM entfernt werden (glaube ich jedenfalls - habe es schon länger nicht genutzt).

Also probiere einfach, Deine Formulare zu schließen und dann das Package "drüberzuinstallieren".
Das musst Du aber ja nur machen, wenn Du eine Änderung zur Designtime benötigst.

Nur (mit dem Hauptprojekt) neu kompilieren wird nicht reichen. Das hat nur Auswirkungen zur Laufzeit.

idefix2 13. Jul 2015 00:33

AW: Eingaben im Objektinspektor prüfen
 
Irgend etwas ist bei meiner Konfiguration nicht in Ordnung.
Beim Deinstallieren des Package habe ich Unmengen Fehlermeldungen bekommen, und wenn ich versuche, wie du hier schreibt, das Package direkt neu zu installieren, bekomme ich die Fehlermeldung
"Package d:\Delphi\Focus\Focus.bpl kann nicht deinstalliert werden."
Die Fehlermeldung kommt auch, nachdem ich alle Programmdateien geschlossen habe und nichts mehr angezeigt wird, was das Package brauchen könnte.

Aber für heute reicht es mir, jetzt gehe ich schlafen.

jaenicke 13. Jul 2015 06:55

AW: Eingaben im Objektinspektor prüfen
 
Ich würde dann einmal bei dem Packages in den Startparametern die IDE eintragen und dann starten. Dann wird Delphi gestartet, aber diesmal im Debugger.
Wenn du jetzt das Packages entfernst, siehst du wo es knallt. Vielleicht ist es ja in deinem eigenen Code im Package.

idefix2 13. Jul 2015 08:51

AW: Eingaben im Objektinspektor prüfen
 
Ich bin nicht sicher, ob ich dich richtig verstehe.
Ich habe jetzt unter Start-Parameter BDS.exe (mit Pfad eingetragen).
Wenn ich jetzt das Package ausführe, versucht er tatsächlich, die IDE noch einmal zu starten. Das scheitert allerdings am bei D2009 notorischen EditorLineEnds.ttr Problem, das sich zu dem Zeitpunkt weder verschieben noch überschreiben lässt, weil ja das erste Delphi noch offen ist.

jaenicke 13. Jul 2015 10:00

AW: Eingaben im Objektinspektor prüfen
 
Daran hatte ich nicht gedacht... d.h. du bekommst die IDE nie ein zweites Mal gestartet? Hatte das IDE Fixpack da nicht eine Lösung parat?
Du könntest in der ersten IDE evtl. mit Hilfe des Process Explorers (von Microsoft herunterladbar) das Handle zu der Datei killen und dann die zweite Instanz starten...
Keine Ahnung, ob das funktioniert.

stahli 13. Jul 2015 10:13

AW: Eingaben im Objektinspektor prüfen
 
Vielleicht geht es auch ohne IDE-Debugging...

Hast Du Dein Package mal allein neu installiert? Also nicht als Teil einer Haupt-Projektgruppe?

Das Problem könnte sonst sein, dass die IDE Instanzen Deiner Controls verwaltet, die Du Ihr durch eine Package-Installation unter dem A... weg ziehst. ;-)

Also versuch mal, nur Dein Package zu laden und dieses neu zu installieren. Danach wieder Dein Projekt laden.

Das ist vielleicht etwas umständlich, aber ja nur nötig, wenn Du wirklich eine neue Variante Deiner Komponente in der Designtime brauchst.

jaenicke 13. Jul 2015 10:31

AW: Eingaben im Objektinspektor prüfen
 
Da zuerst alle Formulare geschlossen werden, dürfte das eigentlich nicht das Problem sein.

stahli 13. Jul 2015 10:40

AW: Eingaben im Objektinspektor prüfen
 
Ich hatte mal so ein Problem mit einem Singleton, das von einem Framework von mir benutzt wurde. Da wurde also ein globale Instanz von einem Objekt benutzt, was zu Problemen führte.

Wenn man die Packages trennt sollte man auf jeden Fall auf der sicheren Seite sein. Zumindest reduziert das die möglichen Probleme etwas.

idefix2 13. Jul 2015 11:00

AW: Eingaben im Objektinspektor prüfen
 
Danke für die Tipps, ich versuche jetzt einmal, das Problem einzugrenzen.
Es ist leider momentan recht mühsam, weil immer, wenn ich das Package deinstallieren will, die IDE komplett abstürzt und in einer Endlosschleife Exceptions bringt, d.h. ich muss Delphi nach jedem derartigen Versuch per Task Manager abschiessen. Aber irgend eine Änderung, die ich zuletzt gemacht habe, muss an dem schuld sein, und das wird sich finden lassen. Am Anfang, wie die Komponente noch fast nichts gemacht hat, konnte ich das Package ja problemlos deinstallieren, danach habe ich es allerdings ziemlich lange nicht versucht, sodass jetzt im prinzip sehr viele verschiedene Dinge an dem Verhalten schuld sein können. Ich werde versuchen, erst wieder einen funktionierenden Zustand herzustellen und dann meine Änderungen der Reihe nach nachzumachen.

jaenicke 13. Jul 2015 12:08

AW: Eingaben im Objektinspektor prüfen
 
Im Zweifelsfall kannst du dir auch eine Trial von XE8 installieren. Da kannst du problemlos debuggen.

Captnemo 13. Jul 2015 16:57

AW: Eingaben im Objektinspektor prüfen
 
Man könnte vielleicht auch einfach die DCU's der Komponente löschen, bzw. das Verzeichnis im dem die Komponente liegt umbenennen. Wenn Delphi startet, sollte es merken, dass die Komponente nicht geladen werden kann. Ich glaube er fragt dann, ob er sie entfernen soll (da bin ich mir nicht ganz sicher), aber ein entfernen sollte dann möglich sein.

jaenicke 13. Jul 2015 21:31

AW: Eingaben im Objektinspektor prüfen
 
Dafür muss man das kompilierte Package (.bpl) löschen. Die .dcu Dateien sind nur die Units.

idefix2 17. Jul 2015 07:34

AW: Eingaben im Objektinspektor prüfen
 
Ich habe jetzt den Eindruck bekommen, dass ich in meinem Delphi 2009 ein Package aus der IDE nur entfernen kann, wenn seit dem Starten der IDE noch keine Komponente des Packages verwendet worden ist, also auch noch keien Unit geöffnet worden ist, in der so eine Komponente zur Design-Zeit vorkommt. Wenn ich so eine Unit einmal angezeigt habe, kann ich das Package danach nicht mehr deinstallieren, ohne die IDE zu einem Totalabsturz zu bringen (Endlosschleife von Exception-Meldungen, nur per Taskmanager zu stoppen), auch wenn ich alle Files schliesse, die mit dem Package zu tun haben. Aus einer frisch gestarteten IDE ist die Deinstallation problemlos möglich.

Das ist beim Entwickeln von Komponenten etwas lästig, aber wenn man es weiss, dann kann man irgendwie damit leben.

stahli 17. Jul 2015 12:22

AW: Eingaben im Objektinspektor prüfen
 
Das ist rel. schwer nachzuvollziehen. D2009 ist ja auch schon eine etwas ältere Version.

Erinnern kann ich mich an solche Probleme nicht.
Aber als Notlösung kannst Du ja dann damit umgehen.
Hautsache Du zerschießt Dir dein Projekt bzw. die Formulare nicht.

Eine Neuinstallation des Packages ist ja dann auch sicher nicht so häufig notwendig.

idefix2 17. Jul 2015 14:25

AW: Eingaben im Objektinspektor prüfen
 
Stimmt. Vor allem am Anfang wird es recht oft nötig sein, das Package neu zu installieren, wenn Funktionalität dazuommt, die schon zur Designtime wichtig ist.
Für alles, was zur Laufzeit passiert, genügt es ja, die Unit neu zu kompilieren.

jaenicke 19. Jul 2015 10:36

AW: Eingaben im Objektinspektor prüfen
 
Das funktioniert normalerweise problemlos, auch mit Delphi 2009 (das habe ich hier in einer VM). Wenn du möchtest, kannst du die Komponente und das Package (ggf. mit so wenig Inhalt wie möglich, aber so dass der Fehler auftritt) hier ja anhängen, dann können wir einmal schauen.
Da ich Delphi 2009 in einer XP VM installiert habe, kann ich auch problemlos die IDE selbst debuggen.

idefix2 20. Jul 2015 18:41

AW: Eingaben im Objektinspektor prüfen
 
Ich stelle so bald wie möglich ein kleines Demoprojekt zusammen, in dem der Fehler nachzuvollziehen ist.
Leider bin ich meistens auf einer Reihe von Baustellen gleichzeitig unterwegs, und das Basteln an einem Satz eigener Komponenten hat da nicht die höchste Priorität, das soll mir eher langfristig die Arbeit erleichtern - aber in den nächsten Tagen komme ich sicher dazu. Es wäre schon beruhigend, den Fehler wegzubekommen, auch in Hinblick auf die Stabilität der Komponente in Zukunft.

Dejan Vu 21. Jul 2015 07:00

AW: Eingaben im Objektinspektor prüfen
 
Eine Komponente mal eben schnell testen geht übrigens viel einfacher (finde ich), wenn man die Komponente in einem Testprojekt erst zur Laufzeit erstellt. Mit einem OI (z.B. dem von Jedi) kann man dann auch interaktiv das Verhalten der einzelnen Properties und den Änderungen prüfen.

Eleganter und nachhaltiger sind da natürlich Unittests, aber dafür müsste man vermutlich dein Klassendesign anpassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr.

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