AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Dynamisch erzeugte TListbox zeigt nicht die Vorauswahl an

Dynamisch erzeugte TListbox zeigt nicht die Vorauswahl an

Offene Frage von "peterbelow"
Ein Thema von mcinternet · begonnen am 3. Aug 2019 · letzter Beitrag vom 4. Aug 2019
Antwort Antwort
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
191 Beiträge
 
Delphi 10.3 Rio
 
#1

Dynamisch erzeugte TListbox zeigt nicht die Vorauswahl an

  Alt 3. Aug 2019, 16:09
Hallo die Gemeinde,

ich habe eine Komponente gebastelt, welche eine TListBox enthält. Klappt auch alles soweit und gut.
Nur eines stört noch: Die TListBox soll bitteschön die Zeile highlighten, welche über .selected, bzw. .itemindex vorausgewählt ist, OHNE dass man was anklicken muss.
Das tut sie leider nicht.

Bild 1 = IST - Zustand
Bild 2 = Soll - Zustand (nach Klick)

Wer hat da eine Idee?

// funktioniert leider nicht!
fLBDruckerAuswahl.ItemIndex := fDruckerNummer;
fLBDruckerAuswahl.Selected[fDruckerNummer];



Die komplette Unit mal anbei



Code:
unit uDruckerPanel;

interface

  uses System.Classes, Vcl.ExtCtrls, Vcl.StdCtrls, AboutOwn;



  Type


    TDruckerPanel = Class(TPanel)
    private

      flblUeberschrift : TLabel;
      flblAnzeigen    : TLabel;
      flblAuswahl     : TLabel;
      flblAuswahlnr   : Tlabel;
      fDrucker : String;
      fDruckerNummer : Integer;
      fDatum        : TDate;
      fVersion      : String;
      fEntwickler   : String;
      fPanTop       : TPanel;
      fPanMid       : TPanel;
      fPanBottom    : TPanel;
      fLBDruckerAusWahl : TListbox;
      FOnChange     : TNotifyEvent;

      Procedure Init;
      Procedure SetScrollWidth(sWidth : Integer);
      function GetScrollWidth : Integer;
      Procedure fLBDruckerAuswahlDoppelKlick(Sender: TObject);
    public
      procedure fLBDruckerAuswahlClick(Sender: TObject);
      Constructor Create(AOwner : TComponent); override;
      Destructor Destroy; override;
      procedure CreateWnd; override;
    published
      property Datum : TDate read fDatum;
      property Version : String read fVersion;
      property Entwickler : String read fEntwickler;
      //----------
      property Drucker : String read fDrucker; // write WriteDruckerName;
      property DruckerNummer : Integer read fDruckerNummer; // write WriteDruckerNummer;
      property ScrollWidth  : Integer read GetScrollWidth write SetScrollWidth;
      property ListBox : TListBox read fLBDruckerAusWahl;
      property OnChange : TNotifyEvent Read FOnChange write FOnChange;
      property PanelTop : TPanel read fPanTop;
      property PanelBottom : TPanel read fPanBottom;
  End;



implementation

//uses Printers;
uses System.SysUtils, VCL.Forms, System.IniFiles, VCL.Printers, VCL.Controls, Vcl.Graphics, VCL.Dialogs;

Procedure TDruckerPanel.SetScrollWidth(sWidth : Integer);
begin
  fLBDruckerAusWahl.ScrollWidth := sWidth;
end;

function TDruckerPanel.GetScrollWidth : Integer;
begin
  result := fLBDruckerAusWahl.ScrollWidth;
end;

Procedure TDruckerPanel.Init;
begin
   fVersion   := sVersion;
   fEntwickler := sEntwickler;
   fDatum     := strtodate(sDatum);
   height     := 400;
   width      := 400;
end;

procedure TDruckerPanel.CreateWnd;
begin
  inherited;
  if (csDesigning in ComponentState) then
  begin
    fLBDruckerAuswahl.Items     := Printer.Printers;
    fDruckerNummer              := Printer.PrinterIndex;
    fDrucker                    := Printer.Printers[Printer.PrinterIndex];
    flblAuswahlnr.Caption       := IntToStr(Printer.PrinterIndex);
    flblAuswahl.Caption         := fDrucker;
    Application.ProcessMessages;
  end;
end;

Constructor TDruckerPanel.Create(AOwner : TComponent);
begin
  inherited create(AOwner);
  Init;

  ParentFont := false;
  ParentColor := false;
  color := clMoneyGreen;

  fPanTop := TPanel.Create(self);
  fPanTop.Parent := self;
  fpanTop.Height := 25;
  fPanTop.Align := alTop;
  fPanTop.ParentColor := false;
  fPanTop.color := clMoneyGreen;

  fPanBottom := TPanel.Create(self);
  fPanBottom.Parent := self;
  fPanBottom.Height := 25;
  fPanBottom.Align := alBottom;

  fPanMid := TPanel.Create(self);
  fPanMid.Parent := self;
  fPanMid.Align := alClient;

  flblUeberschrift := TLabel.Create(self);
  flblUeberschrift.Parent := fPanTop;
  flblUeberschrift.Left := 20;
  flblUeberschrift.Top := 5;
  flblUeberschrift.Caption := 'Druckerauswahl - Doppelkick = Einstellungen';
  flblUeberschrift.ParentFont := false;
  flblUeberschrift.Font.Size := 10;

  fLBDruckerAusWahl := TListbox.Create(self);
  fLBDruckerAusWahl.SetSubComponent(True);
  fLBDruckerAusWahl.Parent := fPanMid;
  fLBDruckerAusWahl.Align := alClient;
  fLBDruckerAusWahl.ParentFont := false;
  fLBDruckerAusWahl.Font.Size := 8;

  flblAnzeigen := TLabel.Create(self);
  flblAnzeigen.Parent := fPanBottom;
  flblAnzeigen.Top := 5;
  flblAnzeigen.Left := 14;
  flblAnzeigen.Caption := 'Auswahl:';
  flblAnzeigen.ParentFont := false;
  flblAnzeigen.Font.Size := 10;


  flblAuswahlnr := TLabel.Create(self);
  flblAuswahlnr.Parent := fPanBottom;
  flblAuswahlnr.Top := flblAnzeigen.Top;
  flblAuswahlnr.Left := 73;
  flblAuswahlnr.ParentFont := false;
  flblAuswahlnr.Font.Size := 10;

  flblAuswahl := TLabel.Create(self);
  flblAuswahl.Parent := fPanBottom;
  flblAuswahl.Top := flblAnzeigen.Top;
  flblAuswahl.Left := 83;
  flblAuswahl.ParentFont := false;
  flblAuswahl.Font.Size := 10;



  if not (CsDesigning in ComponentState) then
  begin
    fLBDruckerAuswahl.Items     := Printer.Printers;
    fDruckerNummer              := Printer.PrinterIndex;
    fDrucker                    := fLBDruckerAuswahl.Items[fDruckerNummer];
    flblAuswahlnr.Caption       := IntToStr(fDruckerNummer);
    flblAuswahl.Caption         := fDrucker;

    // funktioniert leider nicht!
    fLBDruckerAuswahl.ItemIndex := fDruckerNummer;
    fLBDruckerAuswahl.Selected[fDruckerNummer];

    Application.ProcessMessages;
    fLBDruckerAuswahl.OnClick   := fLBDruckerAuswahlClick;
    fLBDruckerAuswahl.OnDblClick := fLBDruckerAuswahlDoppelKlick;
  end;
end;

Destructor TDruckerPanel.Destroy;
begin
  freeandnil(flblAuswahl);
  freeandnil(flblAuswahlnr);
  freeandnil(flblAnzeigen);
  freeandnil(fLBDruckerAusWahl);
  freeandnil(flblUeberschrift);
  FreeAndNil(fPanMid);
  FreeAndNil(fPanBottom);
  FreeAndNil(fPanTop);
  inherited;
end;

procedure TDruckerPanel.fLBDruckerAuswahlClick(Sender: TObject);
begin
  fDrucker              := fLBDruckerAuswahl.Items[fLBDruckerAuswahl.ItemIndex]; //
  flblAuswahl.Caption   := fDrucker;
  fDruckerNummer        := fLBDruckerAuswahl.ItemIndex;
  flblAuswahlnr.Caption := IntToStr(fDruckerNummer);
  printer.PrinterIndex  := fDruckerNummer;
  if Assigned(fOnChange) then fOnChange(Self);
end;

Procedure TDruckerPanel.fLBDruckerAuswahlDoppelKlick(Sender: TObject);
  var printDialog : tprintdialog;
begin
  fLBDruckerAuswahlClick(Sender);
  printDialog := tprintdialog.Create(self);
  printDialog.Execute;
  fLBDruckerAuswahl.ItemIndex := printer.PrinterIndex;
  fLBDruckerAuswahlClick(Sender);
  FreeAndNil(printDialog);
end;



end.

Beste Grüße

mcinternet
Miniaturansicht angehängter Grafiken
billddp1.png   bilddp2.png  
Jörg

Geändert von mcinternet ( 3. Aug 2019 um 16:17 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
372 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Dynamisch erzeugte TListbox zeigt nicht die Vorauswahl an

  Alt 3. Aug 2019, 17:06
Es gibt ein paar Dinge, die nicht funktionieren, wenn ein Control noch keine Window handle hat und zu dem Zeitpunkt auch keines erzeugen kann, z. B. weil der Parent noch nicht gesetzt ist oder selbst kein window handle erzeugen kann. Dazu gehört das setzen des Itemindex in list und comboboxen.

Verschiebe die beiden Zeilen an das Ende der CreateWnd-Methode, da sollte das funktionieren.
Peter Below
  Mit Zitat antworten Zitat
ub60

Registriert seit: 14. Nov 2004
17 Beiträge
 
#3

AW: Dynamisch erzeugte TListbox zeigt nicht die Vorauswahl an

  Alt 3. Aug 2019, 21:33
fLBDruckerAuswahl.ItemIndex := fDruckerNummer; sieht eigentlich gut aus. Eventuell noch einfügen:
fLBDruckerAuswahl.Repaint; oder
fLBDruckerAuswahl.Refresh; Die Zeile
fLBDruckerAuswahl.Selected[fDruckerNummer]; müsste so aussehen:
fLBDruckerAuswahl.Selected[fDruckerNummer]:=True; Das ist aber nur sinnvoll, wenn mehrere Einträge selektiert werden sollen und Multiselect auf True gesetzt ist.

ub60
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
191 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Dynamisch erzeugte TListbox zeigt nicht die Vorauswahl an

  Alt 3. Aug 2019, 22:01
Also, witzig ist, dass der nun in der IDE den selektierten Drucker anzeigt.
Zur Runtime leider nicht

Beim Create:

Code:
  if not (CsDesigning in ComponentState) then
  begin
    fLBDruckerAuswahl.Items     := Printer.Printers;
    fDruckerNummer              := Printer.PrinterIndex;
    fDrucker                    := fLBDruckerAuswahl.Items[fDruckerNummer];
    flblAuswahlnr.Caption       := IntToStr(fDruckerNummer);
    flblAuswahl.Caption         := fDrucker;

    // funktioniert leider nicht!

    Application.ProcessMessages;
    fLBDruckerAuswahl.ItemIndex := Printer.PrinterIndex;
    fLBDruckerAuswahl.Selected[Printer.PrinterIndex];
    fLBDruckerAuswahl.Repaint;
    Application.ProcessMessages;
    fLBDruckerAuswahl.Refresh;
    Application.ProcessMessages;
    fLBDruckerAuswahl.OnClick   := fLBDruckerAuswahlClick;
    fLBDruckerAuswahl.OnDblClick := fLBDruckerAuswahlDoppelKlick;
  end;


CreateWND

Code:
procedure TDruckerPanel.CreateWnd;
begin
  inherited;
  if (csDesigning in ComponentState) then
  begin
    fLBDruckerAuswahl.Items     := Printer.Printers;
    fDruckerNummer              := Printer.PrinterIndex;
    fDrucker                    := Printer.Printers[Printer.PrinterIndex];
    flblAuswahlnr.Caption       := IntToStr(Printer.PrinterIndex);
    flblAuswahl.Caption         := fDrucker;
    Application.ProcessMessages;
    fLBDruckerAuswahl.ItemIndex := Printer.PrinterIndex;
    fLBDruckerAuswahl.Selected[Printer.PrinterIndex] := true;
    fLBDruckerAuswahl.Repaint;
  end;
  Application.ProcessMessages;
end;
Beste Grüße

mcinternet
Jörg
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
372 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Dynamisch erzeugte TListbox zeigt nicht die Vorauswahl an

  Alt 4. Aug 2019, 12:09
Also, witzig ist, dass der nun in der IDE den selektierten Drucker anzeigt.
Zur Runtime leider nicht

Beim Create:
CreateWND

Code:
procedure TDruckerPanel.CreateWnd;
begin
  inherited;
  if (csDesigning in ComponentState) then
  begin
    fLBDruckerAuswahl.Items     := Printer.Printers;
    fDruckerNummer              := Printer.PrinterIndex;
    fDrucker                    := Printer.Printers[Printer.PrinterIndex];
    flblAuswahlnr.Caption       := IntToStr(Printer.PrinterIndex);
    flblAuswahl.Caption         := fDrucker;
    Application.ProcessMessages;
    fLBDruckerAuswahl.ItemIndex := Printer.PrinterIndex;
    fLBDruckerAuswahl.Selected[Printer.PrinterIndex] := true;
    fLBDruckerAuswahl.Repaint;
  end;
  Application.ProcessMessages;
end;
Beste Grüße

mcinternet
Ist doch klar, Du setzt den Itemindex ja nur im Designer! Die fLBDruckerauswahl-Zeilen gehören hinter das end. Und entferne das Repaint und unbedingt auch das ProcessMessages, das macht absolut keinen Sinn!
Peter Below
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 05:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf