AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Probleme mit Custom Propertyeditor für ComboBox
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Custom Propertyeditor für ComboBox

Ein Thema von Neutral General · begonnen am 16. Jun 2014 · letzter Beitrag vom 17. Jun 2014
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Probleme mit Custom Propertyeditor für ComboBox

  Alt 16. Jun 2014, 14:01
Hallo,

Habe eine Komponente die ich von TComboBox abgeleitet habe. Ich habe meine eigene Klasse für die Items der ComboBox und wollte dafür nun einen eigenen Propertyeditor bauen, was soweit auch ganz gut geklappt hat. Für meine eigene TStrings war es außerdem nötig noch eine weitere Property für die DFM zu definieren (FilterProperty).

Die Daten werden in der DFM (auf der Festplatte) gespeichert:

Delphi-Quellcode:
object MyComboBox1: TMyComboBox
  Left = 16
  Top = 16
  Width = 145
  Height = 21
  TabOrder = 0
  Items.Strings = (
    'Test123')
  EditLabel.Width = 3
  EditLabel.Height = 13
  MappedValues = {01000000F412055084C01E2A00000000000000000000000000000000}
end
Sobald ich das Formular aber erneut in Delphi öffne sind "Items.Strings" und "MappedValues" aus der DFM verschwunden. Hat jemand ne Idee wo das Problem liegen könnte?
(Das passiert auch wenn ich mit Alt+F12 zwischen DFM-Code und Formular umschalte - Wenn ich mir die DFM angucke ist alles gut, wenn ich wieder zum Formulare switche sind die Daten weg)

(Ich weiß - ohne Code könnte es schwer sein was zu sagen aber wollte jetzt auch hier nicht meine ganze Komponente + Property-Editor posten. Hoffe erstmal dass jmd. das Problem bekannt vorkommt und weiß was man tun kann/muss).
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (16. Jun 2014 um 14:04 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Probleme mit Custom Propertyeditor für ComboBox

  Alt 16. Jun 2014, 14:07
Wie sieht die Deklaration der Klasse aus?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Probleme mit Custom Propertyeditor für ComboBox

  Alt 16. Jun 2014, 14:21
Ich hab mal ganz grob (die in meinen Augen) wichtigsten Codestellen rausgesucht:

Delphi-Quellcode:
type
  TMyComboBoxStrings = class(TCustomComboBoxStrings)
  private
    FMapValues: TList<TValue>;
  public
    function AddMapped(const S: String; AValue: TValue): Integer;
    // ..
  end;

  TMyComboBox = class(TComboBox)
  protected
    function GetItemsClass: TCustomComboBoxStringsClass; override;
    procedure DefineProperties(Filer: TFiler); override;
    procedure ReadMapList(Stream: TStream);
    procedure WriteMapList(Stream: TStream);
  end;

implementation

function TMyComboBox.GetItemsClass: TCustomComboBoxStringsClass;
begin
  Result := TMyComboBoxStrings;
end;

procedure TMyComboBox.DefineProperties(Filer: TFiler);
begin
  inherited;
  Filer.DefineBinaryProperty('MappedValues',ReadMapList, WriteMapList, Items.Count > 0);
end;
Property-Editor:

Delphi-Quellcode:

// Form was beim Klick auf "..." im Propertyeditor aufgerufen wird
TMyComboBoxItemEditForm = class(TForm)
  // ...
end;

TMyComboBoxItemEditor = class(TPropertyEditor)
public
  procedure Edit; override;
  function GetAttributes: TPropertyAttributes; override;
  function GetValue: String; override;
end;

implementation

procedure TMyComboBoxItemEditor.Edit;
var tmpForm: TMyComboBoxItemEditForm;
    tmpStrings: TMyComboBoxStrings;
begin
  inherited;

  tmpStrings := TMyComboBoxStrings(GetOrdValue);
  if Assigned(tmpStrings) then
  begin
    tmpForm := TMyComboBoxItemEditForm.Create(Application, TMyComboBox(GetComponent(0)), tmpStrings);
    try
      if tmpForm.ShowModal = mrOK then
      begin
        SetOrdValue(Integer(tmpForm.GetResultList()));
        Modified;
      end;
    finally
      tmpForm.Free;
    end;
  end;
end;

function TMyComboBoxItemEditor.GetAttributes: TPropertyAttributes;
begin
  Result := inherited GetAttributes + [paDialog];
end;

function TMyComboBoxItemEditor.GetValue: String;
begin
  if GetOrdValue <> 0 then
    Result := '<' + TObject(GetOrdValue).ClassName + '>'
  else
    Result := '-';
end;

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(TStrings), TMyComboBox, '', TMyComboBoxItemEditor);
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (16. Jun 2014 um 14:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Probleme mit Custom Propertyeditor für ComboBox

  Alt 16. Jun 2014, 15:54
Ich wäre fast geneigt, zu sagen, dass Dir SetSubComponent fehlt (http://www.delphipraxis.net/79726-un...der-gruen.html).

Aber es kann in Deinem Fall (insbesondere bei Generics) natürlich auch andere Ursachen haben. Ich kann da ehrlich gesagt nicht ganz folgen.

Zwei grundsätzliche Überlegungen:

1) Dein Propertyeditor funktioniert erst mal und Du siehst die Einträge dann korrekt im OI?
Dann kannst Du Bei Deiner Fragestellung den PropEditor außen vor lassen und das Problem/die Fragestellung eingrenzen.

2) Evtl. wäre es sinnvoll, auf Collections umzustellen, da diese ausdrücklich dafür da sind, strukturierte Records/Objekte in der DFM zu serialisieren.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#5

AW: Probleme mit Custom Propertyeditor für ComboBox

  Alt 16. Jun 2014, 16:04
Der Property-Editor kümmert sich nur um das Bearbeiten und nichts weiter.

Das Speichern und Laden nimmt bei dir nur das ReadMapList und WriteMapList vor.
Da das Speichern scheinbar geht, ist somit der Fehler bei deiner Lesemethode.

Hast du eigentlich nich ein Property, mit dem Namen "MappedValues" in deiner Klasse?
Wenn ja, dann solltest du besser deinen Speichernamen anders benennen, denn da hatte ich auch schon das Problem, daß das Read auf das richtige Property und nicht auf DefineBinaryProperty/DefineProperty geleitet wurde und dann alles weg war.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Probleme mit Custom Propertyeditor für ComboBox

  Alt 16. Jun 2014, 16:06
@himitsu: Die Daten werden korrekt auf der Platte abgespeichert (habe ich nachgeschaut).
Nur nachdem ich sie erneut lade, killt Delphi sie aus dem DFM. Das gilt nicht nur für meine MappedValues Property sondern auch für die normale "Items" Property. (siehe unten)
(Habe die MapValues auch schon komplett rausgelassen. Trotzdem werden die normalen Strings beim laden verworfen)

Meine Combobox kurz beschrieben:

Die Combobox benutzt eine eigene TStrings-Klasse (TMyComboBoxStrings).
Das ist möglich wenn man GetItemsClass der Combobox überschreibt und seine eigene TStrings-Klasse zurückgibt.

Diese TStrings-Klasse besitzt eine Liste mit Werten. Ich will also für jeden (normalen) Eintrag in der Combobox im Hintergrund noch einen Wert speichern können.

Dafür habe ich jetzt einen Property-Editor geschrieben damit man in der IDE nicht nur den String, sondern auch den dazugehörigen Wert eintragen kann.

zu 1) Ja ich klicke auf "..." neben "Items", mein Property-Editor öffnet sich, ich trage Daten ein und schließe mein Editor-Fenster für die Items wieder. Wenn ich den Editor dann wieder öffne werden die vorher eingetragenen Daten korrekt angezeigt.
Das selbe gilt wenn ich nachdem ich die Daten eingegeben habe Alt+F12 drücke und mir den DFM-Quelltext anschaue. Dort sind die eingetragenen Daten zu sehen.
Wechsel ich jetzt aber wieder in die Nicht-Quelltext-Ansicht der DFM oder öffne ich das Formular neu (natürlich nachdem ich gespeichert habe) dann sind die Änderungen im DFM gelöscht.

Bevor man die DFM erneut lädt (und die Daten weg sind) sind die Daten auch richtig auf der Festplatte gespeichert.

Ich konnte Debuggen dass bevor die Daten verloren gehen ein Items.Clear der ComboBox aufgerufen wird.
Ich weiß allerdings weder woher dieser Aufruf kommt noch ob der Aufruf normal ist und danach eigentlich die Daten wieder aus der DFM geladen werden sollten wobei etwas nicht funktioniert, oder ob dieses Clear da überhaupt nicht passieren sollte.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (16. Jun 2014 um 16:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#7

AW: Probleme mit Custom Propertyeditor für ComboBox

  Alt 16. Jun 2014, 17:38
Ich kann das jetzt nur doe die TCllection auswendig sagen:
  • wenn zum Property ein gleichnamiges Property in der DFM gefunden wird, dann wird Clear aufgerufen und dann wird versucht die Daten zu laden.
  • ohne etwas in der DFM wird kein Clear aufgerufen und das, was eventuell im Contructor eingefügt wurde, bleibt erhalten
  • das Laden der Collection funktionierte erst, als ich das Property im Filer.DefineProperty anders benannte.
  • obwohl man eigentlich für TStrings und TCollection keinen Setter braucht, da alles über die Instanz und nicht über den Instanzzeiger geht, braucht man dennoch einen Setter, wenn man möchte, daß ein TStrings automatisch gespeichert und geladen wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Probleme mit Custom Propertyeditor für ComboBox

  Alt 17. Jun 2014, 09:01
Es geht doch hier um die Standard-"Items" Property einer ganz normalen Combobox.
Ich kann die doch nicht nochmal mit Filer.DefineProperty registrieren. Dann muss ich die ja komplett selbst laden/speichern (was ja in der Basisklasse schon klappt..).
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 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