unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
procedure ComboBoxDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
procedure Button1Click(Sender: TObject);
procedure RunTimeEditClick(Sender:TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
Type
TEnhComboBox =
Class (TComboBox)
Private
fTagParam : Integer;
fComboBoxDrawn : Boolean;
Protected
Published
Property TagParam: Integer
read fTagParam
write fTagParam;
Property ComboBoxDrawn: Boolean
read fComboBoxDrawn
write fComboBoxDrawn
default false;
End;
const FeldTr :
string[1] = '
|';
RowTr :
string[1] = '
;';
CboWidth : integer = 400;
var
Form1: TForm1;
RunTimeCombo :
array[0..100]
of array[0..20]
of TEnhComboBox;
Sender1:^TObject;
//Übergabe des SenderObjects via Zeiger, anders geht es nicht !!!
RunTimeEditX1,RunTimeEditX2 : integer;
implementation
uses unit2;
{$R *.dfm}
procedure TForm1.RunTimeEditClick(Sender:TObject);
begin
//der Sender wird via ZEIGER übergeben, da nur so der Sender in der Unit empfangen wird!!!
Sender1:=@Sender;
unit2.RunTimeEditClick;
end;
procedure TForm1.ComboBoxDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
x,pos1,AnzCol : integer;
strVal, strAll:
string;
rc: TRect;
arrWidth:
array of Integer;
begin
with RunTimeCombo[RunTimeEditX2,RunTimeEditX1]
do
begin
Canvas.Brush.Style := bsSolid;
Canvas.FillRect(Rect);
//Anzahl der Spalten suchen
AnzCol := 1;
for x:=0
to length(RunTimeCombo[RunTimeEditX2,RunTimeEditX1].Items[
index])
do
if copy(RunTimeCombo[RunTimeEditX2,RunTimeEditX1].Items[
index],x,1)=FeldTr
then inc(AnzCol);
//Spaltenarray anlegen
//wichtig: hier wird eine Zeile mehr angelegt, da diese benötigt wird
//um die abschließende Breite zu setzen
SetLength(arrWidth,AnzCol+1);
//Spaltenarray aufteilen
for x:=0
to AnzCol -1
do
arrWidth[x] := 0+((CboWidth
div AnzCol)*x);
//Wichtig: abschließende Breite setzen
arrWidth[AnzCol] := CboWidth;
//aktuellen ArrayString des jeweiligen Index übergeben
strAll := RunTimeCombo[RunTimeEditX2,RunTimeEditX1].Items[
Index];
rc.Top := Rect.Top;
rc.Bottom := Rect.Bottom;
for x:=0
to AnzCol-1
do
begin
// Zeichenbereich für die einzelnen Spalten anlegen
rc.Left := Rect.Left + arrWidth[x] + 2;
rc.Right := Rect.Left + arrWidth[x+1] - 2;
// Text für die jeweilige Spalte ausfiltern
pos1 := Pos(FeldTr, strAll);
if pos1 > 0
then
strVal := Copy(strAll, 1, pos1 - 1)
else
strVal := strAll;
strAll := Copy(strAll, pos1 + 1, Length(strAll) - pos1);
// Text ausgeben
Canvas.TextRect(rc, rc.Left, rc.Top, strVal);
// Trennlinie zwischen Spalten zeichnen
Canvas.MoveTo(rc.Right, rc.Top);
Canvas.LineTo(rc.Right, rc.Bottom);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
unit2.ButtonsErstellen(Form1);
end;
end.