Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Labels schön anordnen... oder ne andere möglichkeit?


Ebil - Di 24.06.08 23:09
Titel: Labels schön anordnen... oder ne andere möglichkeit?
Ich erstelle eine liste die ich mit labels darstellen will in dem vormat.

Blabla: Wert
Dabei sind einige einträge länger
Blablabla:
Das ganze sollte aber gleichmäßig aussehen, deswegen labels.
Das ganze ist etwas schwer anzuordnen, manche labels haben doofe abstände zum darüber liegenden.

Eine listbox macht da ein paar probleme, denn nicht jeder buchstabe ist gleich groß, und somit sieht das ganze ein wenig durcheinander aus, und das will ich vermeiden.
Gibt es denn eine andere komponente die dafür geeignet wäre?


Marc. - Di 24.06.08 23:15
Titel: Re: Labels schön anordnen... oder ne andere möglichkeit?
user profile iconEbil hat folgendes geschrieben:

Eine listbox macht da ein paar probleme, denn nicht jeder buchstabe ist gleich groß, und somit sieht das ganze ein wenig durcheinander aus, und das will ich vermeiden.
Gibt es denn eine andere komponente die dafür geeignet wäre?

Ich weiß zwar nicht genau, was Du vorhast, aber der Font Courier bietet dir gleichmäßig große Letter. ;)

Grüße,
Marc.


Ebil - Di 24.06.08 23:18

Das es auf die schriftart ankommt wusste ich noch garnicht, danke für die info.
Leider passt die überhaupt nicht in mein Projekt :/
(Ich will am besten einfach Labels schön anordnen... das wollen die Labels aba nicht.)

Ebil


Lannes - Mi 25.06.08 00:13

Hallo,

user profile iconEbil hat folgendes geschrieben:
Gibt es denn eine andere komponente die dafür geeignet wäre?

mehrere, je nach Anforderung:
TValueList, TListView, TStringGrid ...

Das Screenshot im Anhang basiert auf ein TStringGrid mit entsprechenden Einstellungen im OI.


alzaimar - Mi 25.06.08 07:29

Eine komerzielle Komponente für das automatische Ausrichten/Anordnen von Controls bietet Developer Express (http://www.devExpress.com) mit seiner TLayoutControl-Suite.

Selbst könntest du es so lösen, das Du zwei Panel (ohne 3D-Rand) vertikal nebeneinander anordnest. Auf das linke Panel kommen alle Label untereinander, auf das rechte Label alle Eingabefelder. Nun kannst Du zur Laufzeit (z.B. im FormCreate) eine einfache Positionierungsschleife implementieren. Damit ist sichergestellt, das wirklich alle Label und Eingabefelder pixelgenau ausgerichtet sind.

Mit einem Stringgrid (FixedColumns = 1) und dem rumspielen mit Ctrl3D könntest du eine Art eindimensionalen Objektinspektor hinbasteln, ich finde die Lösung mit den beiden Panel aber hübscher


Xion - Mi 25.06.08 09:48

oder ganz einfach (dynamisch):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
var List: array of array of String;
    ListLbls: array of array of TLabel;
[...]
{Form.Create:}
var A: integer; MaxW: integer; Spacer: integer;
begin

  Spacer:=5;

  SetLength(List, 2,10);
  SetLength(ListLbls, 2,10);

  List[0,0]:='bla';
  List[1,0]:='500';
  List[0,1]:='blub';
  List[1,1]:='800';
  List[0,2]:='blabla';
  List[1,2]:='1000';
  List[0,3]:='bla';
  List[1,3]:='1500';

  MaxW:=0;
  MaxWDummy:=0;
  for A:=0 to High(List) do
    begin
      MaxW:=MaxWDummy;
      for B:= 0 to High(List[A]) do
        begin
            ListLbl[A,B]:=TLabel.Create(Form1);
            ListLbl[A,B].Parent:=Form1; //< oder hier ein Panel, das kannst du dann auf der Form verschieben und zur Laufzeit wird es dann gefüllt

            ListLbl[A,B].Font.Size:=13;
            ListLbl[A,B].AutoSize:=True
            ListLbl[A,B].Caption:=List[A,B];

            ListLbl[A,B].Left:=Spacer+A*MaxW;
            ListLbl[A,B].Top:=Spacer+B*(ListLbl[A,B].Height+Spacer);

            if (MaxWDummy<ListLbl[A,B].Width) then
              MaxWDummy:=ListLbl[A,B].Width;
      end;
end;


ungetestet

den Code könnte man ganz leicht zu einer eigenen Komponente zusammenfassen


Ebil - Mi 25.06.08 17:42

Hi leute,
Danke für eure mühe, das wird mir dann für sowas aber direkt wieder zu kompliziert Xion ^^.
Ich werds mal mit nem stringrid probieren...

//Edit:Hab das ganze mal mit nem stringgrid gemacht, und sieht ziemlich gut aus, aber ein problem hab ich: Wie kann ich es machen, das man nichts mehr darin auswählen kann, und auch nicht beim start links oben schon etwas markiert ist? Mit Active.Control hab ichs versucht :/.
Ausserdem benutz ich die AlphaControls komponenten(dort ist kein stringgrid bei! leider) und kann die hintergrund farbe nicht ändern, es ist immer schwarz, auch wenn ich es zur laufzeit mache.

Hoffe jemand kennt sich mit dem ding aus ^^

Ebil

//Edit2:
Ok wenn ich die farbänderung NICHT ins OnCreate der Form schreibe, sondern zb in nem button... funktioniert es.
Sehr merkwürdig :/.

Ebil~

//Edit3:
Gut mittlerweile hab ich schonmal keine selektion beim start, und setz enabled auf false, sowas man nichtsmehr auswählen kann, alles zwar bisschen umständlich aber das ist es wohl wert, So hab ich die selektion deactiviert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Const
NoSelection: TGridRect =
(Left:-1; Top:-1; Right:-1; Bottom:-1 );
begin
  StringGrid1.Selection := NOSelection;
end;


Xion - Do 26.06.08 13:22

im Objekt Inspektor hat das StringGrid einen Unterpunkt "Optionen" wenn ich mich nicht irre, da kannst du solche Sachen wie Markierung usw. einstellen