![]() |
Schleife um farbliche Darstellung im VST anzupassen
Hallo zusammen,
ich habe ein VirtualTreeView, in dem ich Zeilen farblich Darstelle wenn gewisse Inhalte im VST stehen. Jetzt habe ich mehrere Checkboxen und RadioButton in einer Konfigurationsform eingebunden, die dem nutzer die Möglichkeit geben soll, diese Farbfilter selber zu erstellen. Das ganz klappt auch ganz gut, ist jedoch sehr umständlich programmiert. Momentan habe ich hunderte Zeilen Code, um das zu realisieren. Ich würde das ganze jetzt gerne der Übersicht wegen in eine Schleife packen. Ich zeige unten mal den Code für einen Farbfilter, von diesen habe ich 15 Stück die der User frei Programmieren kann.
Delphi-Quellcode:
Jetzt habe ich mir überlegt, das ganze mit FindComponent in eine Schleife zu packen, um den eigendlichen Code nur einmal schreiben zu müssen. Besser gesagt um den Code zu kürzen.
case AnsichtForm.RadioGroup1.Itemindex of
0: begin if AnsichtForm.CheckBox1.Checked = true then begin if Pos(AnsichtForm.Edit1.Text,DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := AnsichtForm.ColorBox1.Selected; if Pos(AnsichtForm.Edit2.Text, DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := AnsichtForm.ColorBox1.Selected; end; if AnsichtForm.CheckBox2.Checked = true then begin if Pos(AnsichtForm.Edit1.Text,DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := AnsichtForm.ColorBox1.Selected; if Pos(AnsichtForm.Edit2.Text, DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := AnsichtForm.ColorBox1.Selected; end; if AnsichtForm.CheckBox3.Checked = true then begin if Pos(AnsichtForm.Edit1.Text,DatenMB.Bereich) > 0 then TargetCanvas.Brush.Color := AnsichtForm.ColorBox1.Selected; if Pos(AnsichtForm.Edit2.Text, DatenMB.Bereich) > 0 then TargetCanvas.Brush.Color := AnsichtForm.ColorBox1.Selected; end; end; 1: begin if AnsichtForm.CheckBox1.Checked = true then begin if Pos(AnsichtForm.Edit1.Text,DatenMB.Ereignis) > 0 then begin if Pos(AnsichtForm.Edit2.Text, DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := AnsichtForm.ColorBox1.Selected; end; end; if AnsichtForm.CheckBox2.Checked = true then begin if Pos(AnsichtForm.Edit1.Text,DatenMB.Teilnehmer) > 0 then begin if Pos(AnsichtForm.Edit2.Text, DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := AnsichtForm.ColorBox1.Selected; end; end; if AnsichtForm.CheckBox3.Checked = true then begin if Pos(AnsichtForm.Edit1.Text,DatenMB.Bereich) > 0 then begin if Pos(AnsichtForm.Edit2.Text, DatenMB.Bereich) > 0 then TargetCanvas.Brush.Color := AnsichtForm.ColorBox1.Selected; end; end; end; end; Allerdings, stolper ich da über folgendes Problem, wie kann ich die Funktion FindComponent auf der Hauptform von meinem Programm aufrufen. :gruebel:
Delphi-Quellcode:
Vieleicht kann mir ja jemand einen Tip geben.
//wäre falsch, weil ja so "self" gesucht wird
case(FindComponent('RadioGroup' + IntToStr(iRadioGroup))as TRadioGroup).ItemIndex of //funktioniert so nicht case(FindComponent(AnsichtForm.+ 'RadioGroup' + IntToStr(iRadioGroup))as TRadioGroup).ItemIndex of Danke schon mal. Gruß Jens |
Re: Schleife um farbliche Darstellung im VST anzupassen
Sorry,
hat sich schon erledigt. Manchmal steht man halt neben sich...
Delphi-Quellcode:
Gruß Jens
case(AnsichtForm.FindComponent('RadioGroup' + IntToStr(iRadioGroup))as TRadioGroup).ItemIndex of
|
Re: Schleife um farbliche Darstellung im VST anzupassen
Naja,
so einfach wie ich dachte ist es doch nicht. Ich habe das ganze angepasst, habe auch keinen Fehler beim kompelieren, allerdings wird auch keine Zeile gefärbt. Der Fehler muss irgendwo darin liegen, das die Text der Edit´s nicht gelesen werden. Irgendwas ist da mit FindComponent noch falsch. Vieleicht hat ja doch jemand mal einen Tip.. Hier mein Code..
Delphi-Quellcode:
Danke schon mal
case(AnsichtForm.FindComponent('RadioGroup' + IntToStr(iRadioGroup))as TRadioGroup).ItemIndex of
0: begin if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; iCheckBox := iCheckBox + 1; if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; iCheckBox := iCheckBox + 1; if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Bereich) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Bereich) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; end; 1: begin if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Ereignis) > 0 then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; end; iCheckBox := iCheckBox + 1; if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Teilnehmer) > 0 then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; end; iCheckBox := iCheckBox + 1; if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Teilnehmer) > 0 then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; end; end; end; Gruß Jens |
Re: Schleife um farbliche Darstellung im VST anzupassen
Wieso hast du 3 IFs hintereinander, die denselben Code beinhalten? Verknüpfe die Bedingungen doch einfach mit OR.
Und bitte nicht auf = True vergleichen :duck: |
Re: Schleife um farbliche Darstellung im VST anzupassen
Zitat:
Gruß Jens |
Re: Schleife um farbliche Darstellung im VST anzupassen
Jetzt muss ich aber einmal eine Fangfrage @Jens stellen:
Weisst du was eine lokale Variable ist und wann man sie benützen soll? Ein Tipp: statt zig-Mal TargetCanvas.Brush.Color := irgendwas zu schreiben, schreibt man lieber c:= irgendwas. Und ganz am Schluss wird die Variable zugewiesen:
Delphi-Quellcode:
Und das gilt nicht nur für die Farbe, sondern auch für viele andere Dinge (TEdit-Objekte, TCheckbox-Objekte,...).
TargetCanvas.Brush.Color := c;
Und man kann den Code mit lokalen Funktionen noch viel weiter eindampfen. |
Re: Schleife um farbliche Darstellung im VST anzupassen
Zitat:
Zitat:
Gruß Jens |
Re: Schleife um farbliche Darstellung im VST anzupassen
Also ich würde ja versuchen erstmal Übersicht zu schaffen, indem ich die ganzen AnsichtForm.Findcomponent auslagern würde:
Delphi-Quellcode:
Dann sieht man auch besser durch, ich erkenne kaum was, weil ich das nicht kann, solchen Code zu lesen.
// Index einer gesuchten RadioGroup
function GetRadioGroupIdx(aParent : TWinControl; No : Integer) : Integer; var aName : String; begin aName := 'RadioGroup' + IntToStr(No); Result := (aParent.FindComponent(aName)as TRadioGroup).ItemIndex; end; // Status einer Checkbox function GetCheckBoxState(aParent : TWinControl; No : Integer) : Boolean; var aName : String; begin aName := 'CheckBox' + IntToStr(No); Result := (aParent.FindComponent(aName) as TCheckBox).Checked; end; // usw... procedure TForm1.Button3Click(Sender: TObject); begin // der Case-Konstrukt wird dann übersichtlicher: case GetRadioGroupIdx(AnsichtForm, iRadioGroup) of 0: begin if GetCheckBoxState(AnsichtForm, iCheckBox) then |
Re: Schleife um farbliche Darstellung im VST anzupassen
Zitat:
Also, das mit dem auslagern klingt logisch, kann ich bestimmt ändern. Aber das eigendliche Problem liegt in folgendem Code...
Delphi-Quellcode:
Vieleicht helfen ja die Kommentare. :gruebel:
var
DatenMB : TOMBSerie; DatenUEZ : TOUEZ; iRadioGroup : integer; //Var. aktuelle RadioGroup iCheckBox : integer; //Var. aktuelle CheckBox iEdit1 : integer; //Var. aktuelles Edit 1 sEdit1 : String; //Var. aktueller Text Edit 1 iEdit2 : integer; //Var. aktuelles Edit 2 sEdit2 : String; //Var. aktueller Text Edit 2 iColorBox : integer; //Var. aktuelle ColorBox {alle diese Var. werden von einer anderen Form über folgende Procedure gefüllt} begin iRadioGroup := 1; //initialisieren aller Var. damit diese nicht irgendeinen Unsinn haben iCheckBox := 1; iEdit1 := 1; iEdit2 := 2; sEdit1 := ''; sEdit2 := ''; iColorBox := 1; case Zentralentyp of //Abfrage der Globalen Var. von Form1 Zentralentyp, in der meine aktuelle Zentrale bekannt ist. 0..3: begin //0..3 würden die selben Färbungen fordern DatenMB := TOMBSerie(VST.GetNodeData(Node)^); //Init der Var. DatenMB mit meinem Objekt if Sender.Selected[Node] then Exit; //Abfrage ob UND oder ODER Verknüpft werden soll, das legt die RadioGroup fest. 0= ODER deshalb 2 IF-Abfragen //1= UND deshalb zwei ineinander geschachtelte IF-Abfragen //Der Wert der RadioGroup wird auch richtig ermittelt und somit wird auch im Fall von ODER auf CASE:0 verwiesen. case(AnsichtForm.FindComponent('RadioGroup' + IntToStr(iRadioGroup))as TRadioGroup).ItemIndex of 0: begin //Abfrage welche ob CheckBox 1 gesetzt ist, wird auch mit TRUE beantwortet if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin //Abfrage und vergleich des Textes aus Edit1 mit DatenMB.Ereignis auf >0, müsste mit TRUE beantwortet werden, wird es //aber nicht. Ersetze ich folgende Zeile durch folgenden Code funktioniert es. Daher weiß ich, das hier mein //Fehler liegen muss. //ERSATZCODE, DER FUNTZ: "if Pos(AnsichtForm.Edit1.Text,DatenMBEreignis) > 0 then" if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; Danke schonmal. Gruß Jens |
Re: Schleife um farbliche Darstellung im VST anzupassen
Zitat:
Man, das hat jetzt echt lange gedauert bis ich darauf gekommen. Aber wie kann ich das Problem den am ehesten angehen. Das Problem ist, ich habe die Einstellungen in einer Datenbank aus der ich diese auch lesen könnte, leider ensteht ja dabei das Problem, das ich mein schnelles VST total langsam mache, weil dann ständig neu auf die Datenbank zugegriffen werden muss. Ansonsten müsste ich ja mit Globalen Variablen arbeiten, was man ja absolut nicht gern macht, Außerdem, würde ja dabei irgendwann viel zu viel Speicher durch mein Programm benötigt. Hat den jemand noch irgendeinen Tip für mich. Gruß Jens |
Re: Schleife um farbliche Darstellung im VST anzupassen
Ich glaube, ich höre für heute auf und gehe ins Bett. Jetzt hat es doch geklappt, so wie ich es wollte, auch mit den Lokalen Variablen. Wenn man natürlich keine Schleife um die Abfrage baut, kann das auch nicht funktionieren.
Hier mal mein Code, an dem Ihr aber wahrscheinlich noch massig auszusetzten habt. Bitte lasst Euch aus. Es kann mir ja nur helfen weiterzukommen.
Delphi-Quellcode:
Danke für das Verständnis mit dem nervigen Jens. :wall: :wall:
procedure TForm1.VSTAfterItemErase(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect); var DatenMB : TOMBSerie; DatenUEZ : TOUEZ; iRadioGroup : integer; iCheckBox : integer; iEdit1 : integer; sEdit1 : String; iEdit2 : integer; sEdit2 : String; iColorBox : integer; iSchleife : integer; begin iRadioGroup := 1; iCheckBox := 1; iEdit1 := 1; iEdit2 := 2; sEdit1 := ''; sEdit2 := ''; iColorBox := 1; case Zentralentyp of 0..3: begin DatenMB := TOMBSerie(VST.GetNodeData(Node)^); if Sender.Selected[Node] then Exit; for iSchleife := 0 to 14 do begin case(AnsichtForm.FindComponent('RadioGroup' + IntToStr(iRadioGroup))as TRadioGroup).ItemIndex of 0: begin if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; iCheckBox := iCheckBox + 1; if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; iCheckBox := iCheckBox + 1; if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Bereich) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Bereich) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; iEdit1 := iEdit1 + 2; iEdit2 := iEdit2 + 2; iColorBox := iColorBox + 2; iRadioGroup := iRadioGroup + 1; iCheckBox := iCheckBox + 1; end; 1: begin if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Ereignis) > 0 then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Ereignis) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; end; iCheckBox := iCheckBox + 1; if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Teilnehmer) > 0 then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; end; iCheckBox := iCheckBox + 1; if (AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked = true then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Teilnehmer) > 0 then begin if Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit2))as TEdit).Text,DatenMB.Teilnehmer) > 0 then TargetCanvas.Brush.Color := (AnsichtForm.FindComponent('ColorBox' + IntToStr(iColorBox))as TColorBox).Selected; end; end; iEdit1 := iEdit1 + 2; iEdit2 := iEdit2 + 2; iColorBox := iColorBox + 2; iRadioGroup := iRadioGroup + 1; iCheckBox := iCheckBox + 1; end; end; TargetCanvas.FillRect (ItemRect); end; end; Gruß Jens |
Re: Schleife um farbliche Darstellung im VST anzupassen
Also gefallen muss Dir Dein Code, wobei es ja eine kommerzielle Anwendung wird, weshalb etwas höhere Ansprüche gestellt werden müssen.
Was mich persönlich stört, sind halt diese Konstrukte:
Delphi-Quellcode:
Das könnte man elegant auslagern und sogar Code sparen. Die ganze Routine wird dadurch (zumindest für mich) erheblich übersichtlicher. Dann sieht man sicher auch was noch geht. Der Code im Case Block 0 und 1 lässt sich danach sicher auch nochmal zusammenfassen.
AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked
// bzw. Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Teilnehmer) |
Re: Schleife um farbliche Darstellung im VST anzupassen
Zitat:
Und das ist mir ja zumindestens mal soweit jetzt doch noch gelungen. Mein Grundlegende frage, wäre halt auch, ob das mit den Lokalen Var. und der Konstruktion sonst soweit OK ist. Ich werde die Funktionen mal auslagern, und dann nochmal einstellen. Vieleicht ist es ja dann für Euch besser zu beurteilen. Gruß Jens |
Re: Schleife um farbliche Darstellung im VST anzupassen
So, habe FindComponent ausgelagert, und meine Schleife noch etwas angepasst. Ich denke sieht jetzt schon besser aus. Vieleicht könnt Ihr ja so noch ein bißchen helfen zu verbessern.
Delphi-Quellcode:
Danke schonmal.
{VST Funktion um Abfrage aus der AnsichtForm zu generieren}
function GetRadioGroupIdx(aParent : TWinControl; No : Integer) : Integer; var aName : String; begin aName := 'RadioGroup' + IntToStr(No); Result := (aParent.FindComponent(aName)as TRadioGroup).ItemIndex; end; function GetCheckBoxState(aParent : TWinControl; No : Integer) : Boolean; var aName : String; begin aName := 'CheckBox' + IntToStr(No); Result := (aParent.FindComponent(aName) as TCheckBox).Checked; end; function GetColorBoxInt(aParent : TWinControl; No : Integer) : Integer; var aName : String; begin aName := 'ColorBox' + IntToStr(No); Result := (aParent.FindComponent(aName)as TColorBox).Selected; end; function GetEditString(aParent : TWinControl; No : integer) : string; var aName : String; begin aName := 'Edit' + IntToStr(No); Result := (aParent.FindComponent(aName)as TEdit).Text; end; procedure TForm1.VSTAfterItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect); var DatenMB : TOMBSerie; DatenUEZ : TOUEZ; iRadioGroup : integer; iCheckBox : integer; iEdit1 : integer; sEdit1 : String; iEdit2 : integer; sEdit2 : String; iColorBox : integer; iSchleife : integer; iSchleifeOR : integer; Farbe : Integer; begin iRadioGroup := 1; iCheckBox := 1; iEdit1 := 1; iEdit2 := 2; sEdit1 := ''; sEdit2 := ''; iColorBox := 1; iSchleife := 1; iSchleifeOr := 1; Farbe := 16777215; case Zentralentyp of 0..3: begin DatenMB := TOMBSerie(VST.GetNodeData(Node)^); if Sender.Selected[Node] then Exit; for iSchleife := 1 to 15 do begin case GetRadioGroupIdx(AnsichtForm, iRadioGroup) of 0: begin if GetCheckBoxState(AnsichtForm, iCheckBox) then begin if Pos(GetEditString(AnsichtForm, iEdit1),DatenMB.Ereignis) or Pos(GetEditString(AnsichtForm, iEdit2),DatenMB.Ereignis) > 0 then Farbe := GetColorBoxInt(AnsichtForm, iColorBox); end; iCheckBox := iCheckBox + 1; begin if Pos(GetEditString(AnsichtForm, iEdit1),DatenMB.Teilnehmer) or Pos(GetEditString(AnsichtForm, iEdit2),DatenMB.Teilnehmer) > 0 then Farbe := GetColorBoxInt(AnsichtForm, iColorBox); end; iCheckBox := iCheckBox + 1; begin if Pos(GetEditString(AnsichtForm, iEdit1),DatenMB.Bereich) or Pos(GetEditString(AnsichtForm, iEdit2),DatenMB.Bereich) > 0 then Farbe := GetColorBoxInt(AnsichtForm, iColorBox); end; iEdit1 := iEdit1 + 2; iEdit2 := iEdit2 + 2; iRadioGroup := iRadioGroup + 1; end; 1: begin if GetCheckBoxState(AnsichtForm, iCheckBox) then begin if Pos(GetEditString(AnsichtForm, iEdit1),DatenMB.Ereignis) and Pos(GetEditString(AnsichtForm, iEdit2),DatenMB.Ereignis) > 0 then Farbe := GetColorBoxInt(AnsichtForm, iColorBox); end; iCheckBox := iCheckBox + 1; begin if Pos(GetEditString(AnsichtForm, iEdit1),DatenMB.Teilnehmer) and Pos(GetEditString(AnsichtForm, iEdit2),DatenMB.Teilnehmer) > 0 then Farbe := GetColorBoxInt(AnsichtForm, iColorBox); end; iCheckBox := iCheckBox + 1; begin if Pos(GetEditString(AnsichtForm, iEdit1),DatenMB.Bereich) and Pos(GetEditString(AnsichtForm, iEdit2),DatenMB.Bereich) > 0 then Farbe := GetColorBoxInt(AnsichtForm, iColorBox); end; iEdit1 := iEdit1 + 2; iEdit2 := iEdit2 + 2; iRadioGroup := iRadioGroup + 1; end; end; TargetCanvas.Brush.Color := Farbe; TargetCanvas.FillRect (ItemRect); iColorBox := iColorBox + 2; end; end; end; end; Gruß Jens |
Re: Schleife um farbliche Darstellung im VST anzupassen
Wo genau liegt der Unterschied im Case Block 0 bzw. 1... suche aber finde es gerade nicht. €: gefunden AND/OR
String werden imho in Delphi mit '' initialisiert, bei Ordinalen Werden verwende ich Const, weis aber nicht ob das gut ist:
Delphi-Quellcode:
Für den Case-Block folgende Idee
// statt
var iRadioGroup : integer; begin iRadioGroup := 1; // schreibe ich gerne const iRadioGroup : integer = 1;
Delphi-Quellcode:
Wobei der ganze Vorgang wirklich sehr extrem aussieht. Auch ziemlich anhängig von korrekten Control-Namen etc.
// Funktion sucht Substring und gibt True, wenn entweder einen oder beiden gefunden
function FindStrings(SubStr1, SubStr2, Str : String; FindBoth : Boolean) : Boolean begin if FindBoth then Result := (Pos(SubStr1, Str) > 0) and (Pos(SubStr2, Str) > 0) else Result := (Pos(SubStr1, Str) > 0) or (Pos(SubStr2, Str) > 0); end; // kurz vor der For-Schleife FindBoth := GetRadioGroupIdx(AnsichtForm, iRadioGroup) = 1; // dann statt den beiden Case-Blöcken if GetCheckBoxState(AnsichtForm, iCheckBox) then begin if FindStrings(GetEditString(AnsichtForm, iEdit1), GetEditString(AnsichtForm, iEdit2), DatenMB.Ereignis, FindBoth) then Farbe := GetColorBoxInt(AnsichtForm, iColorBox); [...] Das ganze würde ich irgendwann nochmal komplett überdenken |
Re: Schleife um farbliche Darstellung im VST anzupassen
Zitat:
Das, das Ergebniss jetzt eine kommerzielle Anwendung wird, habe ich ja nie geahnt. Naja, es macht natürlich um so mehr Spaß, wenn man weiß, das es in Zukunft auch genutzt wird, hat aber leider halt den Nachteil, das man etwas unter Druck gerät, was die Lösungsqualität angeht. Ich komme zwar durch meine Ausbildung als Techniker mit der Logik der Programmiersprache klar, habe aber bis jetzt alles selbsständig erlernen müssen. (Natürlich mit der großartigen Unterstützung der DP). Ich will jetzt mal eine Frage stellen, die man hier normal nicht stellt. Wenn jemand meinen Code einigermassen Versteht, kann mir derjenige diesen vieleicht mal in saubere Programmiersprache und Controlnamen ändern, und gegebenfalls Kommentare zur Erläuterung in den Code einfügen. [EDIT] ICH MEINE NATÜRLICH NUR DEN OBEN GEZEIGTEN CODESCHNIPSEL "NICHT MEIN PROGRAMM" [/EDIT] Naja, ansonsten trotzdem Danke. Ich kämpfe weiter und hoffe auf Eure Hilfe. Gruß Jens :thumb: |
Re: Schleife um farbliche Darstellung im VST anzupassen
Zitat:
Nur finde ich extrem wie quasi von Form2 direkt auf Elemente von Form1 zugegriffen wird. Da versucht man doch Form1 eher eine Public Methode zu verpassen. Die ruft man dann von Form2 mit ein paar Parametern auf, um dann ein Ergebnis zu bekommen. Aber denke noch mit den Vorschlag aus meinem letzten Post, wird es wenigstens etwas handlicher. Nur eben wenn Zeit und Kopf frei ist, sollte man mal schauen, ob man die komplette Aufgabe nicht anders angeht, nicht nur an der jetzigen Routine optimieren. |
Re: Schleife um farbliche Darstellung im VST anzupassen
Zitat:
Naja, ich habe es ja jetzt erstmal am laufen, Ich werde jetzt erstmal noch die letzten geforderten Funktion versuchen einzubinden, und ich denke, wenn dann Zeit ist, das Programm eventuell einfach mal komplett zu überarbeiten. Also, nochmals besten Dank. Gruß Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10: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