Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi mysql + stringgrid + farblich markieren (https://www.delphipraxis.net/76051-mysql-stringgrid-farblich-markieren.html)

bl3nder 29. Aug 2006 09:47

Datenbank: mysql • Version: 5.x • Zugriff über: mysql odbc

mysql + stringgrid + farblich markieren
 
Hoi
Ich habe eine mysql Datenbank , wo PCs, Monitore und Dockingstations gespeichert sind.
Ich benutze nur die mysql odbcs , kein zeos oder so.
Ich habe im private von TForm1
fmysql: Tmysqlclient und
Fresult: TmysqlResult
Bisher habe ich die Anzeige der wichtigsten Daten ueber folgende Prozeduren hinbekommen
Zuerst lasse ich mir einen entsprechenden sql befehl geben.
Delphi-Quellcode:
procedure TForm1.mysqlqry ( q : string );
begin


if (q = '') then begin
  q := ' SELECT r.inventar_Nr,r.netzwerkname,a.benutzer ,';
  q := q + ' a.benutzer_alt, a.raum , r.bemerkungen ,m.inventar_Nr, d.inventar_Nr, r.statusID';
  q := q + ' from arbeitsplatz a inner join rechner r ';
  q := q + ' on a.rechnerid = r.rechnerid ';
  q := q + ' left join monitor m ';
  q := q + ' on a.monitorid = m.monitorid ';
  q := q + ' left join dockingstation d ';
  q := q + ' on r.dockingstationid = d.dockingstationid ';
  q := q + ' WHERE "1=1" ';
  end;

FResult := FMysql.query(q, true, ex);
ShowInGrid;


end;
dann die Anzeige im StringGrid

Delphi-Quellcode:
procedure TForm1.ShowInGrid;
var i,j: integer;


begin
if FMySql.Connected then begin

  if assigned(FResult) then begin  // <-- Falls eine SQL Abfrage vorliegt


          Grid.RowCount := FResult.RowsCount+1; // <-- ZeilenAnzahl
          Grid.ColCount := FResult.FieldsCount; // <-- SpaltenAnzahl

          FResult.First;


           for i:=0 to FResult.RowsCount-1 do begin // <-- Zeilen durchlaufen
              for j:=0 to FResult.FieldsCount-1 do // <-- Spalten durchlaufen
                    Grid.Cells[j,i+1] := FResult.FieldValue(j);


              FResult.Next;
          Statusbar1.Panels[0].Text := IntToStr(Grid.RowCount) + ' Einträge';
          end;
  end
  else
    ShowMessage('Keine SQL-Abfrage !');

end
else
  ShowMessage('Not Connected');

end;
Nun moechte ich erreichen, dass er mir statt einer weiteren Spalte fuer "r.StatusID"-Werten die Zeilen abhaengig von der r.StatusID farblich markiert. Da ich aber zu FResult nichts gescheites gefunden habe, dachte ich mir ich frag mal, ob jemand weiß ich das am besten hinkrieg

Bernhard Geyer 29. Aug 2006 09:52

Re: mysql + stringgrid + farblich markieren
 
Schau dir mal das OnDrawCell-Event des Grids an bzw. such mal im Forum. Hatten wir schon öfters.

bl3nder 29. Aug 2006 10:15

Re: mysql + stringgrid + farblich markieren
 
wie ich eine Zeile farblich markiere ist schon irgendwie klar.
Nur will ich ja,dass meine Spalte mit "r.StatusID" verschwindet und sich gleichzeitig aber als Farbe bemerklich macht.

=> Ich muss meine ganze Stringgridanzeige umschmeißen, was ich nicht weiß ichs machen soll.
Denn ich gebe nur die Spalten im Stringgrid aus, die ich auch im mysql qry Browser erhalte.

Jelly 29. Aug 2006 10:27

Re: mysql + stringgrid + farblich markieren
 
Du kommst nicht drumrum, deinen StatusID irgendwie mit im Grid zu speichern. Du musst die Information ja nicht anzeigen, aber du brauchst sie.

Erstell Dir für jeden Record ein Objekt und weist dieses der Eigenschaft
Delphi-Quellcode:
Stringgrid.objects[0,Zeile]
zu.

bl3nder 29. Aug 2006 10:34

Re: mysql + stringgrid + farblich markieren
 
ja ich dachte mir schon , dass ich da nicht drumrum kaeme, aber bisher ist mein Code ja eher auf "alles anzeigen" geschrieben.
Nun muss ich jede Spalte einzeln reinschreiben, damit ich die Wahl hab, was ich anzeigen will und was nicht.

was ich mit dem grid.object machen soll, verstehe ich noch nicht ganz. Und welche records meinst du denn ?
Sry bin noch Anfaenger.

Jelly 29. Aug 2006 10:42

Re: mysql + stringgrid + farblich markieren
 
Dein Grid hat die Eigenschaft Cells[x,y], also ein 2D Array, mit dem Du ja in jede Zelle was reinschreiben kannst.
Und zusätzlich dazu gibts noch das Array Objects[x,y]. Du kannst also jeder Zelle noch ein Objekt zuweisen. Und in dieses Objekt kannst du beliebige Informationen reinschreiben, da es jedes beliebige Objekt sein darf.

Irgendwie durchläufst Du ja deine Query zeilenweise und weist den Inhalt der Zelle zu.. Mach zusätzlich noch eine Objektzuweisung:

Delphi-Quellcode:
type
  TmyObj = class
  public
     StatusID : integer ;
  end ;

...


procedure TForm1.ShowInGrid;
var i,j: integer;


begin
if FMySql.Connected then begin

  if assigned(FResult) then begin  // <-- Falls eine SQL Abfrage vorliegt


          Grid.RowCount := FResult.RowsCount+1; // <-- ZeilenAnzahl
          Grid.ColCount := FResult.FieldsCount; // <-- SpaltenAnzahl

          FResult.First;


           for i:=0 to FResult.RowsCount-1 do begin // <-- Zeilen durchlaufen
              for j:=0 to FResult.FieldsCount-1 do // <-- Spalten durchlaufen
                    Grid.Cells[j,i+1] := FResult.FieldValue(j);

              // hier ergänzen
              myObj := TmyObj.create ;
              myObj.StatusID := FResult.FieldByName('StatusID').AsInteger ;
              Grid.Objects[0,i+1] := myObj ;

              FResult.Next;
          Statusbar1.Panels[0].Text := IntToStr(Grid.RowCount) + ' Einträge';
          end;
  end
  else
    ShowMessage('Keine SQL-Abfrage !');

end
else
  ShowMessage('Not Connected');

end;
Im OnDrawCell Event kannst Du dann auf diese Objekte zugreifen, und entscheiden, in welcher Farbe du zeichnen möchtest.

bl3nder 29. Aug 2006 10:50

Re: mysql + stringgrid + farblich markieren
 
Das Problem ist, dass FResult kein "FieldbyName" Property hat, da es sich hier nicht um ein Query handelt :cry:

Jelly 29. Aug 2006 10:55

Re: mysql + stringgrid + farblich markieren
 
Dann nimm halt FieldValue.

bl3nder 29. Aug 2006 10:57

Re: mysql + stringgrid + farblich markieren
 
fieldvalue hat als parameter Integer

bl3nder 30. Aug 2006 11:52

Re: mysql + stringgrid + farblich markieren
 
wenn ich es so mache , zeigt er mir leider keine Daten an :(

Delphi-Quellcode:
procedure TForm1.ShowInGrid;

  var i,j: integer;
  markierung : tcolor;

  begin
  if FMySql.Connected then begin

    if assigned(FResult) then begin  // <-- Falls eine SQL Abfrage vorliegt


            Grid.RowCount := FResult.RowsCount+1; // <-- ZeilenAnzahl
            Grid.ColCount := FResult.FieldsCount; // <-- SpaltenAnzahl

            FResult.First;

        Grid.RowCount := Grid.RowCount + 1;
            Grid.Cells[0,Grid.RowCount-2] := Fresult.FieldValueByName('Inventar_Nr');
            Grid.Cells[1,Grid.RowCount-2] := Fresult.FieldValueByName('NetzwerkName');
            Grid.Cells[2,Grid.RowCount-2] := Fresult.FieldValueByName('Benutzer');
            Grid.Cells[3,Grid.RowCount-2] := Fresult.FieldValueByName('Benutzer_alt');
            Grid.Cells[4,Grid.RowCount-2] := Fresult.FieldValueByName('Raum');
            Grid.Cells[5,Grid.RowCount-2] := Fresult.FieldValueByName('Bemerkungen');

            FResult.Next;

            Statusbar1.Panels[0].Text := IntToStr(Grid.RowCount) + ' Einträge';
    end
    else
      ShowMessage('Keine SQL-Abfrage !');

  end
  else
    ShowMessage('Not Connected');

  end;
fildbyname muesste bei fresult fieldvaluebyname sein, da er in der klammer einen string erwartet und
so etwas wie .AsString nicht funktioniert


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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