![]() |
Datenbank: mysql • Version: 5.x • Zugriff über: zconnection
zeos stringgrid anzeige
hi
Da ich ohne Zeos wohl nicht auskommen werde, versuch ich nun meine Daten ueber Zeos anzeigen zu lassen. Hab ein Testprojekt angelegt mit folgendem Code, bei dem ich eine "Zugrifssverletzung" an irgendeiner Adresse bekomme. Wo ist der Fehler ? Mach ich grundlegend was falsch ?
Delphi-Quellcode:
Hier das vergebliche Anzeigen der Daten:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection,comctrls, StdCtrls; type TForm1 = class(TForm) sqlconnection : TZConnection; SQLQuery : TZQuery; DataSource1: TDataSource; Grid: TStringGrid; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure filllist(); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var SQLText : String; begin sqlconnection.HostName:='asdf'; //Server sqlconnection.User:='ghjk'; //Benutzername sqlconnection.Password:='qwer'; //Passwort sqlconnection.Database:='test'; //Name der Datenbank sqlconnection.Connect; //Verbindung herstellen if sqlconnection.Connected then label1.Caption := 'connected'; sqlquery.Free; // set SQLText for query SQLText := 'SELECT r.RechnerID, r.Inventar_Nr, r.NetzwerkName, a.Benutzer_alt, a.Benutzer, a.Raum, r.Bemerkungen, r.StatusID, s.Bezeichnung, r.DockingstationID, a.MonitorID, a.Monitor2ID, r.Kaufdatum, r.InventarDatum'; SQLText := SQLText +' FROM Rechner AS r JOIN Arbeitsplatz AS a '; SQLText := SQLText +' JOIN Status AS s '; SQLText := SQLText +' ON s.StatusID = r.StatusID '; SQLText := SQLText +' ON a.RechnerID = r.RechnerID '; sqlquery.SQL.Text := sqltext; sqlquery.Open; filllist; end;
Delphi-Quellcode:
procedure tform1.filllist();
begin Grid.RowCount := 2; Grid.FixedRows := 1; while not sqlquery.Eof do begin while NOT SQLQuery.EOF do begin Grid.RowCount := Grid.RowCount + 1; Grid.Cells[0,Grid.RowCount-2] := SQLQuery.FieldByName('Inventar_Nr').AsString; Grid.Cells[1,Grid.RowCount-2] := SQLQuery.FieldByName('NetzwerkName').AsString; Grid.Cells[2,Grid.RowCount-2] := SQLQuery.FieldByName('Benutzer').AsString; Grid.Cells[3,Grid.RowCount-2] := SQLQuery.FieldByName('Benutzer_alt').AsString; Grid.Cells[4,Grid.RowCount-2] := SQLQuery.FieldByName('Raum').AsString; Grid.Cells[5,Grid.RowCount-2] := SQLQuery.FieldByName('Bemerkungen').AsString; end; end; end; end. |
Re: zeos stringgrid anzeige
Hai bl3nder,
Zitat:
Ausserdem, und das ist ganz wichtig, fehlt Dir ein SQLQuery.Next um nach dem lesen der Daten zum nächsten Datensatz zu springen. So wie Du es jetzt hast wird deine Schleife nie verlassen. |
Re: zeos stringgrid anzeige
Delphi-Quellcode:
Nimm' mal das sqlquery.Free; komplett raus!
...
sqlconnection.Connect; //Verbindung herstellen if sqlconnection.Connected then label1.Caption := 'connected'; sqlquery.Free; // set SQLText for query ... |
Re: zeos stringgrid anzeige
... außerdem solltest du die Query nicht destruieren, wenn du sie noch brauchst ...
Gruß Matthias |
Re: zeos stringgrid anzeige
ok das hat bissl was gebracht . Aber die Zugriffsverletzung besteht weiterhin und die Daten werden noch nicht angezeigt, auch wenn er jetzt zumindest mal 5 spalten anlegt :gruebel:
|
Re: zeos stringgrid anzeige
Warum nutzt Du nicht das DBGrid und bindest es an Deine DataSource1?
Nach dem Query.Open sollte es mit allen Daten befüllt sein und Du brauchst die Schleife nicht. |
Re: zeos stringgrid anzeige
weil ich es unbedingt mit einem stringgrid machen muss, da ich ein Programm nachbaun muss, welches auch ein Stringgrid benutzt.
Deswegen ist es sicher von Vorteil, wenn ich den SourceCode nicht staendig komplett aendern muss, weil DBGrid andere Properties hat. Egal ich weiß was gefehlt hat : SQLQuery.Next ( Edit: Oh hab Sharkys Post garnicht gesehen, du hast es ja schon gesagt :zwinker: ) Danke erstmal. |
Re: zeos stringgrid anzeige
Delphi-Quellcode:
Nicht ZConnection1.Connect.
ZConnection1.Connected := true;
Das Protokoll hast Du auch eingestellt? Gruß Igotcha |
Re: zeos stringgrid anzeige
Hmm trau mich nicht nen neue Thread dafuer aufzumachen:
Nun hab ichs hinbekommen, dass in meinem Programm die Daten angezeigt werden. Jetz moecht ichs aber noch farblich hinterlegen und zwar abhaengig von einem Wert der IntegerSpalte "StatusID" Außerdem moecht ich erreichen, dass er ueber einen Search Button die Suche einschraenken kann Hier mein Code (aufs wichtigste gekuertzt) , hoffentlich einigermaßen verstaendlich Stringgridanzeige
Delphi-Quellcode:
Farblich markieren
procedure TForm1.ShowInGrid( s : String);
var j : integer; begin if SQLConnection.Connected then begin if (s = '') then begin s := ' SELECT '; s := s + ' r.inventar_Nr ,a.benutzer,a.benutzer_alt, r.netzwerkname,a.raum ,'; s := s + ' r.bemerkungen ,m.inventar_Nr, d.inventar_Nr, r.statusid'; s := s + ' FROM arbeitsplatz a inner JOIN rechner r '; s := s + ' ON a.rechnerid = r.rechnerid ' ; s := s + ' LEFT JOIN monitor m ' ; s := s + ' ON a.monitorid = m.monitorid '; s := s + ' LEFT JOIN dockingstation d ' ; s := s + ' ON r.dockingstationid = d.dockingstationid '; s := s + ' WHERE "1=1" '; end; SQLQuery.Close; SQLQuery.SQL.Text := s; SQLQuery.Open; Grid.RowCount := 2; // <-- ZeilenAnzahl Grid.ColCount := 6; // <-- SpaltenAnzahl while not SQLQuery.Eof do begin Grid.RowCount := Grid.RowCount + 1; Grid.Cells[0,Grid.RowCount-2] := SQLQuery.FieldByName('Inventar_Nr').AsString; Grid.Cells[1,Grid.RowCount-2] := SQLQuery.FieldByName('NetzwerkName').AsString; Grid.Cells[2,Grid.RowCount-2] := SQLQuery.FieldByName('Benutzer').AsString; Grid.Cells[3,Grid.RowCount-2] := SQLQuery.FieldByName('Benutzer_alt').AsString; Grid.Cells[4,Grid.RowCount-2] := SQLQuery.FieldByName('Raum').AsString; Grid.Cells[5,Grid.RowCount-2] := SQLQuery.FieldByName('Bemerkungen').AsString; // griddrawcell; // <------ wie muss der syntax aussehen ? SQLQuery.Next; end; Statusbar1.Panels[0].Text := IntToStr(Grid.RowCount) + ' Einträge'; end else ShowMessage('Not Connected'); end;
Delphi-Quellcode:
Mein Search Button
procedure TForm1.GridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState); var markierung : tcolor; var j : integer ; begin // Zeile einfärben markierung := clWindow; case SQLQuery.FieldByName('StatusID').AsInteger of 1: markierung := $00FBE2D9; // hell-blau {Status: verwendet 2: markierung := $0095FF95; // grün {Status: IT-Pool 3: markierung := $005B9DFF; // orange {Status: ausgemustert 4: markierung := $005B9DFF; // orange {Status: verkauft 5: markierung := $0095FF95; // grün {Status: nicht verwendet 6: markierung := $005A5AF5; // rot {Status: ausgeschlachtet 7: markierung := $000D0DD9; // dunkleres-rot {Status: gestohlen end; grid.Canvas.Font.Color := markierung; grid.Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,grid.Cells[ACol,ARow]); end;
Delphi-Quellcode:
Mein Probleme:
procedure TForm1.Btn_SearchClick(Sender: TObject);
var s : string; begin Mc_Bis.Visible := false; Mc_Von.Visible := false; if SQLConnection.Connected then begin //-------Normaler Modus------- if (Ed_InvNr.Enabled and Ed_RName.Enabled and Ed_BName.Enabled )then begin SQLQuery.SQL.Text := ''; s := ' SELECT '; s := s + ' r.inventar_Nr ,a.benutzer,a.benutzer_alt, r.netzwerkname,a.raum ,'; s := s + ' r.bemerkungen ,m.inventar_Nr, d.inventar_Nr, r.statusid'; s := s + ' FROM arbeitsplatz a inner JOIN rechner r '; s := s + ' ON a.rechnerid = r.rechnerid ' ; s := s + ' LEFT JOIN monitor m ' ; s := s + ' ON a.monitorid = m.monitorid '; s := s + ' LEFT JOIN dockingstation d ' ; s := s + ' ON r.dockingstationid = d.dockingstationid '; s := s + ' WHERE "1=1" '; //---------------------------------------------------------------------------- if (trim(Ed_InvNr.Text) <> '') then s := s + ' AND r.Inventar_Nr = "'+trim(Ed_InvNr.Text)+'" '; if (trim(Ed_RName.Text) <> '') then s := s + ' AND r.Netzwerkname = "'+trim(Ed_RName.Text)+'" '; if (trim(Ed_BName.Text) <> '') then s := s + ' AND a.Benutzer = "'+trim(Ed_BName.Text)+'" '; if (trim(Ed_Raum.Text) <> '') then s := s + ' AND a.Raum = "'+trim(Ed_Raum.Text)+'" '; // ====> Ergebnis an die SQL-Query schicken s := s + ' ORDER BY r.Inventar_Nr '; ShowinGrid(s); end else messageDLG('Nicht Verbunden !',mtError,[mbOK],0); Beim Click auf den Suche-Button tut sich nichts Der Syntax der GridDrawCell-Prozedur ist mir nicht ganz klar und wie ich meine momentane Zeile der GridDrawCell-Prozedur vermittle |
Re: zeos stringgrid anzeige
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 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