AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Schleife um farbliche Darstellung im VST anzupassen
Thema durchsuchen
Ansicht
Themen-Optionen

Schleife um farbliche Darstellung im VST anzupassen

Ein Thema von Jens Hartmann · begonnen am 18. Mai 2009 · letzter Beitrag vom 26. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#1

Schleife um farbliche Darstellung im VST anzupassen

  Alt 18. Mai 2009, 17:12
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:
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;
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.


Allerdings, stolper ich da über folgendes Problem, wie kann ich die Funktion FindComponent auf der Hauptform von meinem Programm aufrufen.

Delphi-Quellcode:
 //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
Vieleicht kann mir ja jemand einen Tip geben.

Danke schon mal.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 18. Mai 2009, 17:23
Sorry,

hat sich schon erledigt. Manchmal steht man halt neben sich...

  case(AnsichtForm.FindComponent('RadioGroup' + IntToStr(iRadioGroup))as TRadioGroup).ItemIndex of Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 18. Mai 2009, 18:52
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:
  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;
Danke schon mal

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 18. Mai 2009, 19:07
Wieso hast du 3 IFs hintereinander, die denselben Code beinhalten? Verknüpfe die Bedingungen doch einfach mit OR.

Und bitte nicht auf = True vergleichen
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 18. Mai 2009, 19:15
Zitat:
Wieso hast du 3 IFs hintereinander, die denselben Code beinhalten? Verknüpfe die Bedingungen doch einfach mit OR.
Ja, das weiß ich. Sind aber immer nur zwei if´s, weil danach die CheckBox hochgesetzt wird. Aber das ist ja nicht mein Fehler

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 18. Mai 2009, 19:38
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:
TargetCanvas.Brush.Color := c; Und das gilt nicht nur für die Farbe, sondern auch für viele andere Dinge (TEdit-Objekte, TCheckbox-Objekte,...).

Und man kann den Code mit lokalen Funktionen noch viel weiter eindampfen.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 18. Mai 2009, 20:16
Zitat von sx2008:
Weisst du was eine lokale Variable ist und wann man sie benützen soll?
ich denke schon. Wenn du auf die Variablen iEdit1 und soweiter rauswillst. Die habe sind in der Procedure deklariert. Also lokal und nicht global. Und da ichh Sie lokal integriert habe, müsste ich Ihr doch auch den Wert vom Edit zuweisen können, Oder?

Zitat von sx20008:
Ein Tipp: statt zig-Mal TargetCanvas.Brush.Color := irgendwas zu schreiben, schreibt man lieber c:= irgendwas.
Und ganz am Schluss wird die Variable zugewiesen:
Da gebe ich Dir auch recht, aber da ich ja bei verschiedene Ereignissen, verschieden Farben zuweisen möchte, denke ich das es so richtig ist. Zumindestens weiß ich es nicht besser.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 18. Mai 2009, 22:21
Also ich würde ja versuchen erstmal Übersicht zu schaffen, indem ich die ganzen AnsichtForm.Findcomponent auslagern würde:
Delphi-Quellcode:
// 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
Dann sieht man auch besser durch, ich erkenne kaum was, weil ich das nicht kann, solchen Code zu lesen.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 19. Mai 2009, 15:55
Zitat von Satty67:
Dann sieht man auch besser durch, ich erkenne kaum was, weil ich das nicht kann, solchen Code zu lesen.

Also, das mit dem auslagern klingt logisch, kann ich bestimmt ändern. Aber das eigendliche Problem liegt in folgendem Code...
Delphi-Quellcode:
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;
Vieleicht helfen ja die Kommentare.

Danke schonmal.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#10

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 19. Mai 2009, 20:20
Zitat von sx2008:
Jetzt muss ich aber einmal eine Fangfrage @Jens stellen:
Weisst du was eine lokale Variable ist und wann man sie benützen soll?
Man ey, jetzt habe ich deine Fangfrage verstanden. Das geht ja gar nicht. Lokale Variablen, werden ja bei jedem durchlauf neu initialisiert, und daher wird immer nur der Zustand von der RadioGroup etc. 1 abgefragt.

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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 +1. Es ist jetzt 08:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz