Lazarus unter Linux, TComboBox

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Lazarus unter Linux, TComboBox

Beitrag von MmVisual »

Die Font.Size lässt sich nicht ändern.
Bei TEdit oder TDBEdit geht das und dann wird auch das Steuerelement kleiner dargestellt, bei TComboBox nicht.
Ausserdem übernimmt die Box auch nicht die Font Einstellung aus dem Main-Formular.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Lazarus unter Linux, TComboBox

Beitrag von Scotty »

Ich halte es für keinen Bug, wenn man Standardeinstellungen von Steuerelementen nicht ändern kann. Was machst du, wenn jemand eine besonders große Schrift benutzen will/muss? Unter Windows (XP, Standard Theme) ist der Text in einer CB übrigens kleiner als unter Linux (Human Theme), und ich muss deshalb die Höhe jedes mal anpassen.
Auf den Inhalt der CB hast du natürlich Einfluss per OwnerDraw, MeasureItem etc.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Lazarus unter Linux, TComboBox

Beitrag von MmVisual »

> Unter Windows (XP, Standard Theme) ist der Text in einer CB übrigens kleiner als unter Linux (Human Theme), und ich muss deshalb die Höhe jedes mal anpassen.

Das ist ja mein Problem. Unter Windows bekomme ich VIEL mehr Infos auf mein Formular und habe jetzt Probleme das nach Linux zu portieren. Ich möchte nicht die Windows-Version "Luftig" gestalten, dann es ist ein Programm für Techniker, die Ahnung haben und nicht für Hausfrauen, die schon bei einem Eingabefeld überfordert sind.

Anbei ein Screenshot mit direktem Vergleich (Ubuntu in der Virtual-Box) XP-Version neben dran.
Ich musste in der Linux-Version TForm.Font.Size := 8 setzen, damit einigermassen die Steuerelemente passen. (Tut es dann auch, nur macht da die Combo-Box Probleme >> Folglich BUG)

Wenn man unter Linux die Combo-Box auf macht, dann erscheinen die Items, aber muss denn unbedingt so viel sinnloser Platz zwischen den Items sein?

Ich will ja schließlich keine Touch-Screen Anwendung schreiben! :roll:

Irgendwie fehlen mir die Methoden um das ganze ordentlich aussehen zu lassen, bzw. ich hab die noch nicht gefunden.

Ich hoffe es gibt hier jemand, der mich und das Problem versteht. :mrgreen:
Dateianhänge
Linux-Windows-Vergleich.png
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus unter Linux, TComboBox

Beitrag von theo »

Das kann man schon machen, indem man selber zeichnet.

Setze:
Style auf csOwnerDrawFixed
Dann Itemheight, auf einen Wert (vllt. Canvas.TextHeight('Az');

und dann in OnDrawItem:

Code: Alles auswählen

procedure TForm1.ComboBox1DrawItem(Control:TWinControl;Index:Integer;ARect:TRect
  ;State:TOwnerDrawState);
var Style:TTextStyle;
begin
  Style.Alignment:=taLeftJustify;
  Style.Layout:=tlCenter;
  Style.SystemFont:=false;
  TComboBox(Control).Canvas.FillRect(ARect);
  TComboBox(Control).Canvas.TextRect(ARect,ARect.Left,ARect.Top,TComboBox(Control).Items[Index],Style);
end;
Da kannste noch rumfeilen, aber prinzipiell geht das mit 0.9.29

Für das generelle Layout, vllt mal hier lesen:
http://wiki.lazarus.freepascal.org/Auto ... out#Layout" onclick="window.open(this.href);return false;
http://wiki.lazarus.freepascal.org/Auto ... t#Overview" onclick="window.open(this.href);return false;

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Lazarus unter Linux, TComboBox

Beitrag von mse »

MmVisual hat geschrieben: Ich hoffe es gibt hier jemand, der mich und das Problem versteht. :mrgreen:
Da müsste dir MSEgui eigentlich passen, da achte ich immer sehr darauf, keinen Platz zu verschwenden. Zudem sind die Widgets unter Linux und Windows absolut identisch und in weiten Grenzen anpassbar.

Martin

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Lazarus unter Linux, TComboBox

Beitrag von MmVisual »

Ich hab das mal rein gemacht. Hat leider nicht den gewünschten Effekt, daher auch die Zeile mit Canvas.Font...
Auch wenn ich die ItemHeight Eigenschaft auf 3 klein mache wird das Item nicht kleiner.

Irgend etwas muss da in der ComboBox noch falsch laufen.

Wegen MSEgui, ich wollte so wenig wie möglich externe Komponenten verwenden, bisher läuft alles mit den Lazarus eigenen, bis auf ZeosDBO die ich noch benötige.
Dateianhänge
TCB-ItemHeight.png
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus unter Linux, TComboBox

Beitrag von theo »

Dann versuch's mal mit csOwnerDrawVariable. Ich bin mir da auch nicht ganz sicher.
Jedenfalls sieht's bei mir unter GTK2 mit dieser Methode recht kompakt aus.
Dateianhänge
combofont.png
combofont.png (7.69 KiB) 2914 mal betrachtet

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Lazarus unter Linux, TComboBox

Beitrag von MmVisual »

Die Items hab ich jetzt kleiner bekommen.

Aber die eigentliche ComboBox ist immer noch so groß und die will nicht kleiner werden :(
Auch nicht mit Height := 1;
Dateianhänge
TCB-ItemHeight2.png
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus unter Linux, TComboBox

Beitrag von theo »

MmVisual hat geschrieben:Die Items hab ich jetzt kleiner bekommen.

Aber die eigentliche ComboBox ist immer noch so groß und die will nicht kleiner werden :(
Auch nicht mit Height := 1;
Hast du Autosize ausgeschaltet?
Noch besser wäre vllt ein Layout, welches sich anpasst an die Gegebenheiten der Plattform. (Siehe oben)

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Lazarus unter Linux, TComboBox

Beitrag von Teekeks »

MmVisual hat geschrieben: Wegen MSEgui, ich wollte so wenig wie möglich externe Komponenten verwenden, bisher läuft alles mit den Lazarus eigenen, bis auf ZeosDBO die ich noch benötige.
MSEgui ist übrigens eine selbstständige Entwicklungsumgebung.
Hat also nichts direkt mit Lazarus zu tun, sondern ist noch eine alternative zu Lazarus. (soweit ich weiß, ist die Syntax aber fast gleich).
Weitere Infos findest du hier.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Lazarus unter Linux, TComboBox

Beitrag von MmVisual »

>Hast du Autosize ausgeschaltet?

Jetzt hab ich's gemacht. Ich habs es im Code gemacht, unter FormCreate, da geht es nicht, im FormShow gehts richtig.
Vielen Dank theo für die Hilfe! :D

Ich war mal kurz auf der Seite von MSEgui. Es hat was für sich, aber ich möchte mich im Moment dort nicht neu rein arbeiten. Ich gehe davon aus, dass das Lazarus Formular damit nicht geöffnet/importiert werden kann, oder liege ich da falsch?
Dateianhänge
TCB-ItemHeight3.png
EleLa - Elektronik Lagerverwaltung - www.elela.de

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Lazarus unter Linux, TComboBox

Beitrag von mse »

MmVisual hat geschrieben:Ich gehe davon aus, dass das Lazarus Formular damit nicht geöffnet/importiert werden kann, oder liege ich da falsch?
Da liegst du richtig.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Lazarus unter Linux, TComboBox

Beitrag von MmVisual »

Ich bin mit meiner Zeichnen-Routine immer noch nicht ganz zu frieden. Und zwar sieht die TComboBox anders aus als die TDBComboBox.
Also das was ich zeichne passt schon, aber der Rahmen ist bei beiden unterschiedlich.

Das "InternalDrawItem" hab ich mal raus kopiert, aber der malt dennoch einen anderen Rahmen.

Weiß jemand Bescheid wie ich es hin bekomme, dass eine TComboBox genauso aus sieht wie eine TDBComboBox?

Anbei mein Code:

Code: Alles auswählen

procedure TfrmMain.cboDrawItem(Control: TWinControl; Index: Integer;
  ARect: TRect; State: TOwnerDrawState);
var Style:TTextStyle;
  procedure InternalDrawItem(Control:TControl; Canvas: TCanvas; ARect:TRect; const Text: string);
  var
    OldBrushStyle: TBrushStyle;
    OldTextStyle: TTextStyle;
    NewTextStyle: TTextStyle;
  begin
    OldBrushStyle := Canvas.Brush.Style;
    Canvas.Brush.Style := bsClear;
 
    OldTextStyle := Canvas.TextStyle;
    NewTextStyle := OldTextStyle;
    NewTextStyle.Layout := tlCenter;
    NewTextStyle.RightToLeft := Control.UseRightToLeftReading;
    if Control.UseRightToLeftAlignment then
    begin
      NewTextStyle.Alignment := taRightJustify;
      ARect.Right := ARect.Right - 2;
    end
    else
    begin
      NewTextStyle.Alignment := taLeftJustify;
      ARect.Left := ARect.Left + 2;
    end;
 
    Canvas.TextStyle := NewTextStyle;
 
    Canvas.TextRect(ARect, ARect.Left, ARect.Top, Text);
    Canvas.Brush.Style := OldBrushStyle;
    Canvas.TextStyle := OldTextStyle;
  end;
begin
//  TComboBox(Control).Canvas.Brush.Color := clHighlight;
//  TComboBox(Control).Canvas.Font.Color := clHighlightText;
    TComboBox(Control).Canvas.FillRect(ARect);
    InternalDrawItem(TControl(Control), TComboBox(Control).Canvas, ARect, TComboBox(Control).Items[Index]);
(*  Style.Alignment:=taLeftJustify;
  Style.Layout:=tlCenter;
  Style.SystemFont:=false;
  TComboBox(Control).Canvas.FillRect(ARect);
  TComboBox(Control).Canvas.TextRect(ARect,ARect.Left + 2,ARect.Top,TComboBox(Control).Items[Index],Style);
*)
end;
 
Procedure CheckComboForLinux(f: TForm);
Var i: Integer;
    cb: TComboBox;
Begin
  {$ifdef LINUX}
  For i := 0 To f.ComponentCount - 1 Do
  Begin
    If (f.Components[i] Is TComboBox) Or (f.Components[i] Is TDBComboBox) Then
    Begin
      cb := TComboBox(f.Components[i]);
      cb.Font.Size := f.Font.Size;
      cb.Style := csOwnerDrawVariable;
      cb.ItemHeight := 1;
      cb.OnDrawItem := @frmMain.cboDrawItem;
      cb.AutoSize := False;
      cb.Height := 21;
    end;
  end;
  {$endif}
end;
Vielen Dank für eure Hilfe, Gruß Markus
Dateianhänge
TCB-ItemHeight4.png
TCB-ItemHeight4.png (4.79 KiB) 2894 mal betrachtet
EleLa - Elektronik Lagerverwaltung - www.elela.de

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Lazarus unter Linux, TComboBox

Beitrag von mse »

Apropos "luftig" und Linux, die spinnen die Römer.
Ich habe öfters zum debuggen mehrere MSEide Istanzen laufen. Unter KDE4 sieht dann ein Klick auf die Taskleiste wie angehängt aus. Es haben nicht mehr alle Fenster-icon platz und gerne würde ich eigentlich auf den unter dem netten luftigen popup-hint-Fenster verborgenen button klicken...
Taskwechsel mittel Alt-Tab ist noch schlimmer, die buttons sind dort so riesig, dass lediglich 16 auf den Schirm passen, manchmal dauert es eine halbe Minute (!) bis die Auswahl erscheint, richtig schnell und "snappy" ist eigentlich überhaupt nichts mehr. Der Dateimanager (Dolphin) braucht etwa 10 Sekunden zum Start, das Erscheinen von Dateiauswahl-Fenstern dauert Sekunden, usw.usw.
Und dann diese nervigen und die Arbeit bremsenden Animationen, ich verstehe die Leute nicht, die so etwas mögen.

Martin
luftig.png

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Lazarus unter Linux, TComboBox

Beitrag von Scotty »

Ein Vorteil ist, dass Programmierer dadurch zu einer übersichtlichen Struktur gezwungen werden :twisted:

Antworten