Autor Beitrag
Aphexz
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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:
ausblenden 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 user profile iconChristian S.: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Sa 07.05.2005 um 18:31
feivel3333
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190

W7
Delphi XE prof
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190

W7
Delphi XE prof
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190

W7
Delphi XE prof
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190

W7
Delphi XE prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190

W7
Delphi XE prof
BeitragVerfasst: 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.

ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
niPos := StringGrid.ColCount;

// Von rechts nach links prüfen, ob die Zellen gelöscht werden müssen:
while niPos > 0 do begin
   // Liegt der Inhalt der Zelle innerhalb der anzuzeigenden Start- und Endzeit?
   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 user profile iconraziel: Delphi-Tags hinzugefügt.
Einloggen, um Attachments anzusehen!
Aphexz Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190

W7
Delphi XE prof
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
for niSpaltenPos := 1 to niSpaltenAnz do begin					

sondern
ausblenden Delphi-Quelltext
1:
for niSpaltenPos := 0 to niSpaltenAnz do begin					


sowie
ausblenden Delphi-Quelltext
1:
for niZeilenPos := 1 to niZeilenAnz do begin					

tauschen gegen
ausblenden 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 user profile iconraziel: Delphi-Tags hinzugefügt.
Aphexz Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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