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 2 von 2     12   
Benutzerbild von Jens Hartmann
Jens Hartmann

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

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 19. Mai 2009, 20:33
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:
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;
Danke für das Verständnis mit dem nervigen Jens.

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
 
#12

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 19. Mai 2009, 20:40
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:
AnsichtForm.FindComponent('CheckBox' + IntToStr(iCheckBox)) as TCheckBox).Checked
// bzw.
Pos((AnsichtForm.FindComponent('Edit' + IntToStr(iEdit1))as TEdit).Text,DatenMB.Teilnehmer)
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.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

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

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 19. Mai 2009, 20:47
Zitat von Satty67:
Das könnte man elegant auslagern und sogar Code sparen.
Das werde ich aufjedenfall noch machen. Ich bin dir auch sehr dankbar für den Tip. Es stört mich nämlich selber ein bißchen. Ich wollte es halt erstmal ans laufen bringen.

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
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
 
#14

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 19. Mai 2009, 21:47
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:
{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;
Danke schonmal.

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
 
#15

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 19. Mai 2009, 22:05
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:
// statt
var
  iRadioGroup : integer;
begin
  iRadioGroup := 1;

// schreibe ich gerne
const
  iRadioGroup : integer = 1;
Für den Case-Block folgende Idee
Delphi-Quellcode:
// 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);
[...]
Wobei der ganze Vorgang wirklich sehr extrem aussieht. Auch ziemlich anhängig von korrekten Control-Namen etc.
Das ganze würde ich irgendwann nochmal komplett überdenken
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

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

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 20. Mai 2009, 21:39
Zitat von Satty67:
Wobei der ganze Vorgang wirklich sehr extrem aussieht. Auch ziemlich anhängig von korrekten Control-Namen etc.
Das ganze würde ich irgendwann nochmal komplett überdenken
Ja, wenn ich dich richtig versteh, meinst Du meine Namensgebung etc. Das Problem, ist das ich das ganze mal irgendwann aus einem Hobby herraus angefangen habe.

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
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
 
#17

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 20. Mai 2009, 23:03
Zitat von Jens Hartmann:
Ja, wenn ich dich richtig versteh, meinst Du meine Namensgebung etc.
Nein, das nicht mal so sehr, für den gewählten Weg ist es wahrscheinlich sogar so besser.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

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

Re: Schleife um farbliche Darstellung im VST anzupassen

  Alt 26. Mai 2009, 19:41
Zitat von Satty67:
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.
Da hast Du wahrscheinlich sogar recht. Mein Problem ist nur, das ich das mit den Methoden und Parametern noch nicht so ganz verstanden habe. Ich denke diese Grundlage müsste ich mir erstmal erarbeiten.

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


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 03:18 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