Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ValueListEditor (https://www.delphipraxis.net/212308-valuelisteditor.html)

wendelin 23. Jan 2023 18:33

Delphi-Version: 7

ValueListEditor
 
Hallo Delphifreunde,

ich habe eine einzige Frage :
Ist die Pickliste des ValueListEditors auch zur Laufzeit editierbar (insert, delete etc.)
Kann man die o.g. Pickliste zur Laufzeit speichern oder laden.

Für ein kurzes Beispiel wäre ich dankbar.

Wendelin (wolfgang)

himitsu 23. Jan 2023 18:36

AW: ValueListEditor
 
Er hat eine Stringlist (TStrings) und damit kann man alles machen, was man sonst auch damit machen kann.

wendelin 1. Feb 2023 00:11

AW: ValueListEditor
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke Himitsu für Deine Antwort,

Ich brauche den VLE um beim Einlesen von historischen Aktienkursen die kryptische WKN in den Aktienklarnamen zu übertragen.
Es liest sich einfacher!

Nun ist aber beim herumspielen mit dem testprogramm ein eigenartiges Problem aufgetaucht, welches ich nicht erklären kann.
Ich habe ein kurzes Testprogramm geschrieben. Ausschlieslich zum VALUELISTEDITOR.
Es klappt alles bis auf die Ausgabe der Pickliste im Memo. Siehe "procedure TForm1.BitBtn10Click(Sender: TObject);"
Vielleicht hast Du ja eine Erklärung.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids, ValEdit;

type
  TForm1 = class(TForm)
    ValueListEditor1: TValueListEditor;
    Edit1: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    BitBtn5: TBitBtn;
    Memo1: TMemo;
    BitBtn6: TBitBtn;
    BitBtn7: TBitBtn;
    BitBtn8: TBitBtn;
    BitBtn9: TBitBtn;
    BitBtn10: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
    procedure BitBtn7Click(Sender: TObject);
    procedure BitBtn9Click(Sender: TObject);
    procedure BitBtn10Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1       : TForm1;
  Aktienname : TStringList;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  with ValueListEditor1 do
  begin
    DisplayOptions := [doColumnTitles,doAutoColResize];
    TitleCaptions[0] := 'WKN';
    TitleCaptions[1] := 'Aktienname';          // PickListe
    Aktienname      := TStringList.Create;
    Aktienname.Add('Cameco');
    Aktienname.Add('Infineon');
    Aktienname.Add('Livent');
    Aktienname.Add('Lynas');
    Aktienname.Add('Nordex');
    Aktienname.Add('Nel');
    Aktienname.Add('PlugPower');
    Aktienname.Sort;
    Edit1.Text := '?`';
  end;
end;
         (* Hinzufügen *)
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  with ValueListEditor1 do
  begin
    InsertRow(Edit1.Text,' ',False);
    with ItemProps[Row-1] do
    begin
      EditStyle := esPickList; // Klappbox
      PickList :=Aktienname;
    end
  end;
end;

         (* Zeile löschen *)
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  With ValueListEditor1 do if Strings.Count > 0 Then DeleteRow(Row);
end;
         (* Zeile überschreiben *)
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  with ValueListEditor1 do if Strings.Count > 0 then Keys[Row] := Edit1.Text;
end;
          (* Speichern *)
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
  ValueListEditor1.Strings.SaveToFile('TestDat');
end;
          (* Laden *)
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
  ValueListEditor1.Strings.LoadFromFile('TestDat');
end;
            (* Inhalt VLE --> Memo *)
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
  Memo1.Lines := ValueListEditor1.Strings;
end;
           (* PickListe aktualisieren *)
procedure TForm1.BitBtn7Click(Sender: TObject);
begin
  Aktienname.Add(Edit1.Text)
end;
     (* gesammte PickListe löschen *)
procedure TForm1.BitBtn9Click(Sender: TObject);
begin
  Aktienname.Clear;
end;
     (* PickListe --> Memo1 *)
procedure TForm1.BitBtn10Click(Sender: TObject);
Var Laenge,i : Integer;
begin
  Laenge := AktienName.Count;
  showMessage(IntToStr(Laenge));       // Laenge ist OK
  For i := 0 to (Laenge -1) do
  begin
    ShowMessage(AktienName[i]);        // hier OK !! es kommen alle 7 Aktienklarnamen
    Memo1.Lines[i] := AktienName[i];   // Hier Fehler !!??  hier kommen nur 2 ?
  end;
end;

end.

Delphi.Narium 1. Feb 2023 01:10

AW: ValueListEditor
 
Wieviele Zeilen hat das Memo denn?

Genausoviel wie Aktienname? Wo wird das sichergestellt?

Was sagt denn
Delphi-Quellcode:
ShowMessage(Memo1.Lines.Count)
? Zufällig 2?

Wie wäre es denn mit
Delphi-Quellcode:
     (* PickListe --> Memo1 *)
procedure TForm1.BitBtn10Click(Sender: TObject);
Var Laenge, i : Integer;
begin
  Memo1.Lines.Clear;
  Laenge := AktienName.Count;
  ShowMessage(IntToStr(Laenge)); // Laenge ist OK
  for i := 0 to (Laenge - 1) do
  begin
    ShowMessage(AktienName[i]); // hier OK !! es kommen alle 7 Aktienklarnamen
    Memo1.Line.Add(AktienName[i]); // Hier werden nun alle Aktienklarnamen ans Memo angehängt.
  end;
end;

himitsu 1. Feb 2023 03:10

AW: ValueListEditor
 
globale Variablen :freak:


Nja, wenn das Memo nur 2 Zeilen hat, dann kann auch nur bei 2 Zeilen der Inhalt gesetzt werden.

Dein Glück, oder Pech, dass Memo.Lines (TMemoStrings), entgegen zu einer TStringList, beim Zugriff auf nichtexistierende Zeilen keine Exception auslöst, sondern dann einfach still und heimlich nichts macht.
Delphi-Quellcode:
Memo1.Text := AktienName.Text;

// oder
Memo1.Lines.Text := AktienName.Text;

// oder
Memo1.Lines := AktienName;

// oder
Memo1.Lines.Clear;
Memo1.Lines.AddStrings(AktienName[i]);


Und würde man den Komponenten und Events ordentliche Namen geben, dann wären solche (*Kommentare*) nutzlos. :zwinker:

PS: Zusätzlich ein "etwas" aktuelleres Delphi und schon hat man schöne Dinge, seit über 10 Jahren.
Delphi-Quellcode:
/// <summar> Speichern </summary>
procedure TForm1.BitBtn4Click(Sender: TObject);
https://www.embarcadero.com/de/products/delphi/starter
https://docwiki.embarcadero.com/RADS...n/Help_Insight

oder
https://devjetsoftware.com/products/...ation-insight/
und viele weitere Projekte, wie Hilfegeneratoren

wendelin 1. Feb 2023 10:13

AW: ValueListEditor
 
Danke Himitsu,
Deine ersten 2 Vorschläge funktionieren beide.
Gleichgültig ob mit oder ohne Memo1.Clear.
Zu Deinem Vorschlag ein neueres Delphi zu verwenden: Ich bin mittlerweile 77 Jahre alt und ein reiner Delphi-Autodidakt.
"Never change a running system". Ist mir auch zu teuer !

Danke nochmals !!


Delphi-Quellcode:
     (* PickListe --> Memo1 *)
procedure TForm1.BitBtn10Click(Sender: TObject);
Var Laenge,i : Integer;
begin
  Memo1.Clear;
  Laenge := AktienName.Count;
  showMessage(IntToStr(Laenge));      // Laenge ist OK
  For i := 0 to (Laenge -1) do
  begin
    Memo1.Lines[i]    := AktienName[i]; // lustig --> wenn ich Memo1.Clear einsetze kommt nur noch ein Aktienname (sonst 2)
 //   Memo1.Lines.Text := AktienName.Text; // es funktionieren beide Vorschläge
 //   Memo1.Text      := AktienName.Text; // es funktionieren beide Vorschläge
  end;
end;

Delphi.Narium 1. Feb 2023 10:35

AW: ValueListEditor
 
Zitat:

Zitat von wendelin (Beitrag 1518132)
Danke Himitsu,
Deine ersten 2 Vorschläge funktionieren beide.
Gleichgültig ob mit oder ohne Memo1.Clear.
Zu Deinem Vorschlag ein neueres Delphi zu verwenden: Ich bin mittlerweile 77 Jahre alt und ein reiner Delphi-Autodidakt.
"Never change a running system". Ist mir auch zu teuer !

Danke nochmals !!


Delphi-Quellcode:
     (* PickListe --> Memo1 *)
procedure TForm1.BitBtn10Click(Sender: TObject);
Var Laenge,i : Integer;
begin
  Memo1.Clear;
  Laenge := AktienName.Count;
  showMessage(IntToStr(Laenge));      // Laenge ist OK
  For i := 0 to (Laenge -1) do
  begin
    Memo1.Lines[i]    := AktienName[i]; // lustig --> wenn ich Memo1.Clear einsetze kommt nur noch ein Aktienname (sonst 2)
 //   Memo1.Lines.Text := AktienName.Text; // es funktionieren beide Vorschläge
 //   Memo1.Text      := AktienName.Text; // es funktionieren beide Vorschläge
  end;
end;


Delphi-Quellcode:
     (* PickListe --> Memo1 *)
procedure TForm1.BitBtn10Click(Sender: TObject);
Var Laenge,i : Integer;
begin
  Memo1.Clear;
  Laenge := AktienName.Count;
  showMessage(IntToStr(Laenge));      // Laenge ist OK
  For i := 0 to (Laenge -1) do
  begin
    Memo1.Lines.Add(i]) := AktienName[i];
  end;
end;
oder
Delphi-Quellcode:
     (* PickListe --> Memo1 *)
procedure TForm1.BitBtn10Click(Sender: TObject);
begin
  Memo1.Lines.Text := AktienName.Text; // Alle AktienNamen werden auf einmal ins Memo übertragen.
end;
oder
Delphi-Quellcode:
     (* PickListe --> Memo1 *)
procedure TForm1.BitBtn10Click(Sender: TObject);
begin
  Memo1.Text := AktienName.Text; // Alle AktienNamen werden auf einmal ins Memo übertragen.
end;
Warum die "oder"?
Delphi-Quellcode:
AktienName.Text;
enthält bereits alle Texte, so dass hier die For-Schleife entfallen kann. Bei Nutzung der Vorschleife wird quasi für jeden Aktiennamen einmal alles durch alles ersetzt. Es wird also unnütz viel Aufwand betrieben.

Abgesehen davon ist Delphi 7 nach wie vor eine excellent gute Entwicklungsumgebung und immernoch mein 'Lieblingsspielzeug'. Die Masse der Probleme, nach deren Lösung hier im Forum bezüglich neuerer Delphiversionen und der IDE gefragt wird, hat man mit Delphi 7 einfach nicht ;-)
Und nein, es ist nicht mehr "state of the art", aber als Hobby für das, was man so als Rentner benötigt, reicht es vollkommen aus ;-)

Maekkelrajter 1. Feb 2023 11:16

AW: ValueListEditor
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1518135)
Abgesehen davon ist Delphi 7 nach wie vor eine excellent gute Entwicklungsumgebung und immernoch mein 'Lieblingsspielzeug'. Die Masse der Probleme, nach deren Lösung hier im Forum bezüglich neuerer Delphiversionen und der IDE gefragt wird, hat man mit Delphi 7 einfach nicht ;-)
Und nein, es ist nicht mehr "state of the art", aber als Hobby für das, was man so als Rentner benötigt, reicht es vollkommen aus ;-)

Zitat:

Zitat von wendelin (Beitrag 1518132)
Zu Deinem Vorschlag ein neueres Delphi zu verwenden: Ich bin mittlerweile 77 Jahre alt und ein reiner Delphi-Autodidakt.
"Never change a running system". Ist mir auch zu teuer !

Man kann trefflich darüber streiten, 'was man als Rentner so benötigt'. Ich jedenfalls (Rentner, 76, Hobby-Entwickler und Autodidakt) möchte auf die Errungenschaften der neueren Delphi-Versionen nicht mehr verzichten. Das ist ja auch nicht nötig, alldieweil es ja die kostenlose Community-Edition gibt.
Auch ich habe allerdings die Erfahrung gemacht, dass es mit zunehmendem Alter schwerer fällt, sich in etwas Neues einzuarbeiten. Aber das kann man ja mit der CE risikolos ausprobieren.

Gruß LP

Delphi.Narium 1. Feb 2023 11:36

AW: ValueListEditor
 
Die Smilies in meinen Text sind ja nicht so ganz unbeabsichtigt.

Natürlich kann man auch als Rentner 'ne neue Delphiversion, die auch noch kostenlos ist, nutzen oder einfach FreePascal verwenden und zum Frischhalten der grauen Zellen auch was Neues ausprobieren.

Man hat als Rentner halt die Freiheit zu entscheiden: Delphi 7 reicht mir oder ich will was Neues. Das "Muss" zum Aktuellbleiben ist aber nicht mehr da und das kann schon ganz schön entspannend wirken.

Frei nach dem Motto: Wenn ich was Neues ausprobieren möchte, dann tu ich's, wenn nicht, dann lass ich's. Es gibt noch soviel mehr im Leben, als Programmieren ;-)

Maekkelrajter 1. Feb 2023 12:43

AW: ValueListEditor
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1518140)
Die Smilies in meinen Text sind ja nicht so ganz unbeabsichtigt.

Ich bitte um Nachsicht, aber wenn ich Rentner-Bashing auch nur wittere, dann wird bei mir ein Reflex getriggert, der dazu führt, dass ich sogar Smileys ignoriere :wink:
Dann gilt es nur noch, aufs energischste dem Eindruck entgegenzutreten, dass Rentner den ganzen Tag vor dem Fernseher oder auf der Parkbank sitzen, grundsätzlich Gas- und Bremspedal verwechseln und sich auf Kaffefahrten oder per Enkeltrick abzocken lassen! :wink:
So, jetzt wird's aber endgültig O.T. :oops:

Gruß LP

Delphi.Narium 1. Feb 2023 13:33

AW: ValueListEditor
 
Ich gehöre auch "zum alten Eisen", sprich: bin Rentner. Und sehe das Rentnerdasein mit 'nem Augenzwinkern, weil all die Klischees über Rentner irgendwie so überhauptganzundgarnichtnochnichtmalansatzweisenoc hvielwenigerundsowiesonicht passen :-)

wendelin 1. Feb 2023 18:48

AW: ValueListEditor
 
Hallo Delphinarium,

das mit der unnützen Schleife ist mir auch schon aufgefallen.
Delphi-Quellcode:
Memo1.Text := AktienName.Text; // Alle AktienNamen werden auf einmal ins Memo übertragen.

Ein weiterer Grund für mein Festhalten an Delphi7 ist eine kommerzielle Komponentenbibliothek von 'Epina' ( früher ?? )die ich mir
vor Jahren gekauft hatte (Chart, Math und Base ohne Quellcode!! als vorkompilierte Packages) und die nur unter D7 läuft.
Ich bin damit sehr zufrieden.

Gruß Wolfgang

himitsu 1. Feb 2023 18:54

AW: ValueListEditor
 
Ja, das ist immer ein Problemchen.

Das ist auch ein Grund, warum Viele versuchen nur noch Komponenten mit Sourcen zu benutzen/kaufen.
Ist dann zwar meistens (erstmal) teurer, aber ...


Teilweise kann man bei einigen Komponenten sie z.B. mit dem alten Delphi in eine DLL kompilieren und nutzt dann diese DLL im neuen Delphi,
aber bei VCL-Komponenten ist das nicht so leicht.

Delphi.Narium 1. Feb 2023 19:39

AW: ValueListEditor
 
Zitat:

Zitat von wendelin (Beitrag 1518190)
Ein weiterer Grund für mein Festhalten an Delphi7 ist eine kommerzielle Komponentenbibliothek von 'Epina' ( früher ?? )die ich mir
vor Jahren gekauft hatte (Chart, Math und Base ohne Quellcode!! als vorkompilierte Packages) und die nur unter D7 läuft.
Ich bin damit sehr zufrieden.

Kommt mir bekannt vor, hab' das gleiche Problem mit Komponente aus anderer Quelle, nur die DCU-Dateien für Delphi 7 und alles für die VCL.

Aber: et löppt. Und damit bin ich zufrieden :-)

himitsu 2. Feb 2023 07:45

AW: ValueListEditor
 
Wo war nochmal das Beispiel, wo uralter TurboPascal-Code nahezu unverändert noch in aktuellem Delphi lief?
Damals bei TurboDelphi (2006).

Gut, abgesehn von paar Dingen, welche zu viele Entwickler falsch gemacht haben (z.B. seit der WinNT weiterhin immer AdminRechte und beschreibbare ProgrammVerzeichnisse), ist Delphi an sich relativ unabhängig von Fremdkomponenten.
(Gut, nicht ganz, aber auch in aktuelleren Delphis wird weiterhin versucht wieder Abstand von .NET und Co. zu nehmen)

Probleme sind ja auch nicht nur die neuen IDEs, für alte DCUs/BPLs ohne PAS.
Wenn der Komponenten-Entwickler plötzlich weg ist oder mit der Komponente aufhört oder man selber mal was bugfixen oder anpassen will/muß oder ...

dummzeuch 2. Feb 2023 08:10

AW: ValueListEditor
 
Zitat:

Zitat von himitsu (Beitrag 1518191)
Das ist auch ein Grund, warum Viele versuchen nur noch Komponenten mit Sourcen zu benutzen/kaufen.
Ist dann zwar meistens (erstmal) teurer, aber ...

Wie? Es gibt auch Leute, die das nicht tun? Das war schon die eiserne Regel bei meiner ersten Stelle, wo Delphi benutzt wurde (Ende der 1990er, also zur Hochzeit von Delphi) Nichts wird ohne Sourcecode gekauft, wenn das nicht geht oder zu teuer ist, wird nach einer Alternative geschaut oder selbst programmiert.

Diese Regel hat sich über die Jahre immer wieder bestätigt und heute ist es für eine Firma, die Delphi einsetzt überlebensnotwendig, weil immer wieder die Hersteller von Komponenten einfach verschwinden (teilweise im Wortsinn aus"sterben").

freimatz 2. Feb 2023 08:30

AW: ValueListEditor
 
:thumb: Nie fremde Komponenten ohne Sourcen. Nie! (nie)
Analog zu einem anderen Spruch: Keine Sourcen kein Mitleid.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 Uhr.

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