| Autor |
Beitrag |
Aphexz
Hält's aus hier
Beiträge: 8
|
Verfasst: Sa 07.05.05 17:30
Ich möchte dass in einer Stringgrid die ersten beiden Stellen jeder Zelle, der ersten Zeile überprüft werden, ob sie in einem bestimmten intervall liegen, wenn sie außerhalb des Intervalls liegen wäre es mir am liebsten, wenn die komplette Spalte gelöscht wird. Dies wusste ich nicht zu realisieren also habe ich an die Möglichkeit gedacht, den Inhalt der Spalten zu leeren, die ich nicht brauche.
Ich scheitere aber daran, dass leere Spalten ja keinen Boolean-Wert zurückgeben und ich diese somit nicht in eine If-Verzweigung einbeziehen kann.
Ich möchte, dass leere Zellen/Spalten einfach übersprungen werden, aber wie kann ich die Bedingung formulieren, dass eine Spalte leer ist?
Meine Idee war folgende,die aber leider scheitert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| spalte:=4; zeile:=1; while not zeile=Stringgrid1.RowCount do begin value:=Stringgrid1.Cells[spalte,zeile]; if value='' then zeile:=zeile+1 else begin valueshort:=value[1]+value[2]; hour:=strtoint(valueshort); end; if (hour>=zt1)and (hour<=zt2) then zeile:=zeile+1 else begin Stringgrid1.Cells[spalte,zeile]:=''; zeile:=zeile+1; end;
end; |
Entschuldigt bitte meine schlechte Ausdrucksweise, ich weis aber nicht, wie ich das Problem richtig formlurien soll. Ich muss das Programm am Montag früh abgeben, aber bin am Ende meiner Nerven, da ich den Filter nicht hinbekomme. In der Stringgrid sollen nur die (Bus-)Linien angezeigt werden, deren Start- bzw. Ankunftszeit im generierten Zeitintervall liegen. Würde mich rießig freuen, wenn mir jemand helfen kann.
Ich habe das Programm mal hochgeladen, ihr könnt es euch ja mal runterladen und anschauen: Download Fahrplaner
Vielen Dank.
mfg Christian Moderiert von Christian S.: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Sa 07.05.2005 um 18:31
|
|
feivel3333
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: Sa 07.05.05 18:44
Titel: Bus-Fahrplaner
Hi,
konnte dein Proggi leider nicht öffnen, da du ADO-Tables benutzt. Ich habe keine ADO-Tables. Wofür benötigst du die?
Könntest du mal genauer beschreiben, was das Programm macht? Vielleicht fällt mir eine Alternative ein.
Gruß, André
|
|
Aphexz 
Hält's aus hier
Beiträge: 8
|
Verfasst: Sa 07.05.05 18:57
Ich verwende die ADOTable um meine Daten aus der MS-Access-DB ein Delphi einzulesen.
Ne andere Möglichkeit ist mir nicht bekannt, höchstens ne ADO-Query in Verbindung mit SQL, habe ich aber schon versucht, mit SQL sind einige Dinge unmöglich, die mit der ADOTable funzen, zumindest aus meiner Sicht.
Aber die exe geht bei dir , oder? Damit du dir erstmal ein Bild davon machen kannst, um was es überhaupt geht.
Ich brauche ne Prozedur, die durch die nach dem Einlesen der Daten aus der DB in die Stringgrid, durch die Stringgrid läuft und alle Spalten entfernt/leert/etc. , in denen die Zeit des ersten Ortes, bzw. des letzten Ortes nicht im Intervall liegt, welches man über der Stringgrid sehen kann (Anfang Intervall=volle Stunden der eingegebenen Zeit-2; Ende des Intervalls=volle Stunden der eingegebenen Zeit+2).
|
|
feivel3333
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: Sa 07.05.05 19:13
Meinst du wirklich Spalten (senkrecht) oder Zeilen (waagerecht), die gelöscht werden
sollen?
Prinzipiell ist das Löschen von Zeilen bzw. Spalten nicht schwer. Sicher gibt es keine direkte Prozedur dafür, doch die Prozedur dafür zu schreiben kann nicht allzu kompliziert sein.
Doch da fällt mir gerade ein, wenn du doch schon die Daten aus einer Datenbank ausliest, warum nutzt du dann kein DbGrid und filterst die Datenbank entsprechend, dann würde deine Anzeige doch schon automatisch richtig dargestellt.
|
|
Aphexz 
Hält's aus hier
Beiträge: 8
|
Verfasst: Sa 07.05.05 21:10
Habe keinen Plan, wie der Filter der DBGrid funktioniert hast du ne Ahnung, wie das geht?
Hier mal mein Filter für die Stringgrid, vielleicht fällt ja jemand der Fehler auf:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| spalte:=1; zeile:=1; while not zeile=Stringgrid1.ColCount-1 do begin if Stringgrid1.Cells[spalte,zeile]<>'' then begin b:=Stringgrid1.Cells[spalte,zeile]; e:=b[1]+b[2]; c:=strtoint(e); if (c>=zt1) and (c<=zt2) then spalte:=spalte+1 else begin repeat Stringgrid1.Cells[spalte,zeile]:=''; zeile:=zeile+1; until zeile=Stringgrid1.RowCount-1; spalte:=spalte+1; end; end else begin repeat Stringgrid1.Cells[spalte,zeile]:=''; zeile:=zeile+1; until zeile=Stringgrid1.RowCount-1; spalte:=spalte+1; end; end; |
mfg Aphexz
|
|
feivel3333
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: Sa 07.05.05 21:34
Nu mal langsam und zum Mitdenken: Du holst die Daten aus einer Datenbank. Zuvor definierst du eine Uhrzeit, und es sollen nur die Elemente der Datenbank angezeigt werden, die auf die Uhrzeit passen.
Also in dem Moment, wo du die Uhrzeit eingegeben hast, kannst du doch diese als Filterkriterium nutzen, um damit das StringGrid zu füllen.
Leider weiß ich nicht so genau, wann du die Uhrzeit einträgst, und wann das StringGrid befüllt wird.
Und vor allem weiß ich nicht, auf welche Weise du das StringGrid befüllst. Nimmst du aus der Datenbank alle Einträge und füllst diese gnadenlos in das Grid?
|
|
Aphexz 
Hält's aus hier
Beiträge: 8
|
Verfasst: Sa 07.05.05 21:54
Hast du dir das Programm mal angeschaut? Starte einfach mal die exe, da siehste vieles
Als erstes Wähle ich den Startort aus ner Combobox aus, die ihren Inhalt aus der DB bezieht(keine DBCombobox), dann wird dieser als Text in ein Label geschrieben/übergeben.
Dannklicke ich auf weiter und wähle Zielort aus, nach dem gleichen Prinzip wie Startort.
Dann weiter und in Radiogroup auswählen ob Start- oder Ankunftszeit, dann in MaskEdit-Feld mit Zeitmaske die gewünschte Zeit eingeben. So jetzt erscheint ein Button um nächstes Tabsheet aufzurufen, wenn man diesen drückt, werden alle Daten aus der Tabelle BusB11 der DB (bis auf den Primärschlüssel) in die Stringrid übergeben. Danach wird eine Prozedur zum Erstellen der Kopfzeile der Stringgrid mit "Spaltennamen" gestartet.
Und danach sollte ursprünglich der Filter durchlaufen. Wenn Startzeit im ersten Tabsheet in der Radiogroup ausgewählt wurde soll der die 2. Zeile (1. unter festem Tabellenkopf) auf das Zeitintervall überprüfen, wenn in einer Spalte die Zeit der 2. Zeile der Stringgrid nicht im Zeitintervall liegt, soll die komplette Spalte gelöscht werden und die nächste geprüft werden, wenn die Zeit im Intervall liegt soll gleich die nächste geprüft werden, bis zum Ende der Grid. Wenn im ersten Tabsheet Ankunftszeit ausgewählt wurde, soll es analog laufen, nur dass die letzte Zeile der Grid auf das Intervall überprüft wird, weil Ankunftszeit.
Ziel ist es, dass dann nur noch die erste Spalte mit den Orten und die Spalten/Linien, wo die Start- bzw. Ankunftszeit im Intervall liegt, angezeigt werden.
Hoffe man sieht in dieser Beschreibung etwas durch.
Habe keine Vorstellung, wie ich gleich filtern soll, beim auslesen der DB, kannst mir ja mal nen Vorschlag/Ansatz geben, wäre super. Kann aber auch sein, dass ich einfach schon zu müde bin. Setz mich morgen wieder ran, das Prob ist halt nur, dass ich das Ding Montag abgeben muss
Danke für deine großen Mühen einem Anfänger zu helfen, ist echt nett.
mfg Christian
|
|
feivel3333
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: So 08.05.05 11:36
Titel: Weiter geht´s mit dem Busfahrplan
Guten Morgen!
Zwischendrin mal eine Frage: Wie komme ich an diese ADO-Tables? Welche Delphi-Version hast du? Ich sehe es nicht in deinen Einstellungen dieses Forums. Hätte ich die ADOs, könnte ich das Ding kompilieren. So kann ich nur kucken, aber nichts ändern.
Gruß, André
|
|
feivel3333
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: So 08.05.05 12:31
Titel: StringGrid Spalten und Zeilen löschen
Auch wenn du gerade am Mittagessen bist...
Als Idee: Wenn du die Haltestelle kennst, von der du abfährst (numerisch auszulesen aus der ersten Seite deines Programms), dann weißt du schon mal die Zeilen-Position in deinem StringGrid.
Sämtliche vor dieser Haltestelle liegenden Daten, also alle Zeilen, die darüber liegen, dürften dich nicht mehr interessieren. Diese Zeilen müssen gelöscht werden. Wie da geht, kommt gleich...
Nun geht es daran, die Zeilen zu löschen, die nach deiner gewünschten Haltestelle liegen, denn der Fahrgast steht ja nur an einer speziellen Haltestelle und will nicht die Zeiten wissen, wann der Bus an einer nachfolgenden Haltestelle liegt. Also lösche auch die Zeilen, die nach der gewünschten liegen. Wie das geht, gleich...
Es ist jetzt nur noch eine Zeile übrig. Nämlich genau die, die namentlich der Haltestelle entspricht, von der du abfährst.
Jetzt musst du nur noch von RECHTS nach LINKS (wichtig, sonst ahne ich große Probleme!!!), also mit einer rückwärts laufenden For-Schleife sämtliche Zellen (das sind ja jetzt nicht mehr viele) prüfen, ob sie zeitlich gesehen in dein Intervall passen.
Startzeit und Endzeit würde ich mir in zwei Variablen legen, die den Typ TDateTime haben (Uhrzeit-Variablen).
Also z.B.
Delphi-Quelltext 1: 2:
| tiStartZeit := StrToTime( SubStr( lbl_zint.Caption, 10, 5 ) ); niEndeZeit := StrToTime( SubStr( lbl_zint.Caption, 20, 5 ) ); |
Ich habe hiermit aus dem Text deines Anzeigelabels ein Stück String herausgeschnitten und es in das Zeit-Format umgewandelt.
Die Zelle, die du überprüfen musst, kannst du folgendermaßen checken:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| niPos := StringGrid.ColCount;
while niPos > 0 do begin if ( StrToTime( StringGrid1.Cells[ 1, niPos ] ) < niStartZeit ) or ( StrToTime( StringGrid1.Cells[ 1, niPos ] ) > niEndeZeit ) then SpalteLoeschen( niPos ); dec( niPos ); end; |
Die Prozedur SpalteLoeschen( niPos ) musst du dir selbst schreiben, allerdings habe ich dir die Arbeit fast abgenommen, denn in dem kleinen Progrämmchen, das hier unten zum Download bereit liegt, findest du erstens, wie man eine Spalte löscht, zweitens, wie man eine Zeile löscht. Das Programm beinhaltet natürlich auch die SubStr-Funktion und noch ein paar weitere. Ich habe sie aus Gewohnheit so genannt, ich meine, es gibt da auch Funktionen im Delphi, die ähnlich heißen. Copy oder so... Aber als gewohnter ehemaliger Clipper-Programmierer hat man so seine Angewohnheiten.
Wenn du mit der Konstruktion der Funktion nicht klar kommst, musst du mir mailen oder schreiben.
Gruß, André
Moderiert von raziel: Delphi-Tags hinzugefügt.
Einloggen, um Attachments anzusehen!
|
|
Aphexz 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 08.05.05 14:43
Danke erstmal,
ich werde deine Lösung bissl anpassen und ausprobieren. Ich möchte ja nicht nur eine Zeile in der Stringrid ausgeben, sondern alle Haltestellen, die zwischen ausgewählter Start- und Zielhaltestelle liegen, inkl. Start- und Zeilhaltestelle, aber das habe ich schon hinbekommen, funzt auch.
In der Schule benutzen wir Delphi 6 Enterprise und zuhause nutze ich Delphi7 Enterprise, da ist die ADO-Komponente drin. In der 5 ist die soweit ich weis noch nicht enthalten. Keine Ahnung, ob man die nachinstallieren kann.
mfg Christian
|
|
Aphexz 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 08.05.05 16:33
Klappt nicht ganz mit deiner Prozedur. Weil bei mir einige Felder der Stringgrid leer sind hängt sich das Prog auf mit der Fehlermeldung: "Im Projekt Project_fahr.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung:'" ist keine gültige Uhrzeit'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen."
Die Zeiten in der DB von mir liegen auch als Text vor, da die erste Zeile in der Tabelle BusB11 der DB mit Worten gefüllt ist, könnte man ändern, wäre aber ein ziemlicher Aufwand und die Leefelder bleiben auf jeden Fall bestehen. Wie kann ich veranlassen, mit deiner Prozedur, dass die Spalten, wo das Feld in der ersten Zeile leer ist gleich komplett gelöscht werden?
Hast du ICQ? Wenn ja adde mich mal bitte, meine Nummer 109442603
mfg Christian
|
|
Aphexz 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 08.05.05 17:30
Habs nun nach längerem anpassen hinbekommen, funktioniert alles wie ich möchte, bis auf eine Sache, bei der du mir nochmal helfen kannst.
Der Tabellenkopf soll nicht fest sein, sprich es sollen die Linien angezeigt werden, die auch wirklich zu den Zeiten passen, deine Spaltenlösch-Prozedur verschiebt den Kopf nicht mit, so werden bei mir je nach Eingabe zwar verschiedene Zeiten angezeigt, aber die Linien sind immer Fahrtnr 001, Fahrtnr 003,..., Fahrtnr 017. Wie bekomme ich es hin, dass die richtigen Linien passend zu den Zeiten stehen bleiben? Werd noch selber bissl tüfteln, aber wenn du schnell ne Antwort parat hättest wäre das natürlich super, da ich mich dann schon anderen Dingen des Programms zuwenden könnte.
mfg Christian
|
|
feivel3333
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: So 08.05.05 18:40
Hi,
habe kein ICQ, habe AIM, dort Feivel3333.
Wenn du den Kopf mitlöschen willst, dann schreibe in die Funktion zum löschen nicht
Delphi-Quelltext 1:
| for niSpaltenPos := 1 to niSpaltenAnz do begin |
sondern
Delphi-Quelltext 1:
| for niSpaltenPos := 0 to niSpaltenAnz do begin |
sowie
Delphi-Quelltext 1:
| for niZeilenPos := 1 to niZeilenAnz do begin |
tauschen gegen
Delphi-Quelltext 1:
| for niZeilenPos := 0 to niZeilenAnz do begin |
Sicher, du hast dadurch, dass dort eine 1 stand, natürlich nur die weißen Zellen erwischt. aber es gibt ja noch eine nullte Zeile...
André
Moderiert von raziel: Delphi-Tags hinzugefügt.
|
|
Aphexz 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 08.05.05 19:13
Super hat funktioniert.
habe leider kein AIM, habe noch ein kleines Prob, dazu ist mir aber gerade ein Lösungsansatz eingefallen, falls doch noch irgendwelche Fragen offen bleiben werde ich nochmal posten. Ansonsten häng ich bei Gelegenheit dann mal das Prog hier an, so wie ich es abgeben werde/abgegeben habe.
Weist du wie man ne rtf-Hilfe einbindet? Das müsste ich noch machen.
Ansonsten vielen, vielen Dank, ohne deine Hilfe wäre ich gescheitert. Man hört sicherlich nochmal voneinander. Programmierst du beruflich mit Delphi/hast du beruflich mit Delphi zu tun gehabt? Oder nur reine Freizeitaktivität?
mfg Christian
|
|
|