| Autor |
Beitrag |
combocracker
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 03.01.04 14:53
Hallo alle zusammen. Ich habe mich entschieden für ein Projekt Delphi zu benutzen. Meine Kenntnisse gehen hier aber leider nicht über das Schuldelphi hinaus. Bitte nehmt euch eine Sekunde Zeit, um meine Fragen zu beantworten.
Im Projekt verwende ich ein ziemlich großes Stringgrid (1025*1025). Dadurch entstehen erhebliche Geschwindigkeitsprobleme. Die möchte ich jetzt lösen:
Ich lasse über das ganze Grid verteilt Rechtecke einfärben, Text ausgeben und Kreise malen.
 Ich möchte aber jetzt erreichen, dass immer nur der Teil des Stringgrids geladen wird, der auch gerade angezeigt wird. (Der restliche Teil ist ja 'verborgen' (man muss erst dorthin scrollen) und der soll noch nicht geladen werden.) Geht so etwas??!
 Momentan kenne ich nur zwei Möglichkeiten:
- entweder über OnDrawCell, das aber extrem oft aufgerufen wird und dadurch das Programm extrem verlangsamt.
- oder ich lasse es ohne OnDrawCell malen, dann wird aber nur der angezeigte Teil des Stringgrids behandelt. Wenn ich scrolle, dann ist dort nichts zu sehen, gehe ich zurück, dann ist der alte Teil auch verschwunden.
Gibt es nicht irgendwie eine Aktion, die nur aufgerufen wird, wenn man die Scrollbalken betätigt? Das wäre optimal.
Habe auch noch ein paar weitere Fragen:
 Wie erreiche ich es, dass beim Start nicht immer das erste Kästchen blau eingefärbt ist, also markiert ist?
 Wie schalte ich es aus, dass man im StringGrid nicht mehr markieren kann und mit den Pfeiltasten nicht mehr Felder auswählen kann? (Wusste es schon einmal, habe es aber wieder vergessen.  )
 Wie male ich z.B. eine Ellipse in z.B. dem Feld (500/600). Habe ganz normal mit Canvas.Ellipse und dort die Pixelangaben eingegeben. Aber, wenn das Feld nicht sichtbar ist, dann erscheint die Ellipse immer oben links in meinem Programm. ;-( Dasselbe passiert bei TextOut. Wie erreiche ich es, dass Sachen in Felder gemalt werden, die nicht angezeigt werden? Also so, dass es gemalt wird und man dann erst dorthin scrollen muss, um es zu sehen.
Letzte Frage: Versteht ihr, was ich meine?  Jedenfalls jetzt schon einmal vielen Dank für eure Hilfe.
Gruß, Moritz.
PS: Habe vorhin andere Themen durchgeforstet und keins gefunden, dass meine Frage beantwortet. Falls es doch schon eines geben sollte: Entschuldigung.
|
|
combocracker 
Hält's aus hier
Beiträge: 5
|
Verfasst: So 04.01.04 17:32
Hat keiner eine Antwort?! 
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 04.01.04 17:51
das liegt wahrscheinlich daran, das wenige Leute Lust haben, sich durch einen ellenlangen Thread mit vielen Fragen zu lesen. Da geht bei ein paar Antworten schnell die Übersicht verloren . eine frage pro thread is da besser.
und wenn du hier schon hier: www.delphipraxis.net...ndel+von+fragen.html
gefragt hast, warum 2x antworten? Hier zu drängeln und auch ohne im anderen thread geantwortet zu haben , finde ich schon ein wenig frech.
| Zitat: |
Ich möchte aber jetzt erreichen, dass immer nur der Teil des Stringgrids geladen wird, der auch gerade angezeigt wird. (Der restliche Teil ist ja 'verborgen' (man muss erst dorthin scrollen) und der soll noch nicht geladen werden.) Geht so etwas??!
|
keine Ahnung, was du hier mit geladen meinst.
Ein Teil deiner Fragen läßt sich auch mit der Onlinhilfe lösen:
| Zitat: |
Gibt es nicht irgendwie eine Aktion, die nur aufgerufen wird, wenn man die Scrollbalken betätigt? Das wäre optimal.
|
Ereignis : topleftchanged
| Zitat: |
Wie schalte ich es aus, dass man im StringGrid nicht mehr markieren kann und mit den Pfeiltasten nicht mehr Felder auswählen kann? (Wusste es schon einmal, habe es aber wieder vergessen. )
|
Ereignis ONSELECTCELL
| Zitat: |
Wie erreiche ich es, dass beim Start nicht immer das erste Kästchen blau eingefärbt ist, also markiert ist?
|
gibts im EDH einen Tip dazu ( www.delphi-treff.de)
| Zitat: |
Wie male ich z.B. eine Ellipse in z.B. dem Feld (500/600). Habe ganz normal mit Canvas.Ellipse und dort die Pixelangaben eingegeben. Aber, wenn das Feld nicht sichtbar ist, dann erscheint die Ellipse immer oben links in meinem Programm. ;-( Dasselbe passiert bei TextOut. Wie erreiche ich es, dass Sachen in Felder gemalt werden, die nicht angezeigt werden? Also so, dass es gemalt wird und man dann erst dorthin scrollen muss, um es zu sehen.
|
du verwendest ondrawcell wahrscheinlich falsch. ohne ein paar Codeschnippsel kann man dir nicht weiterhelfen. such mal im Forum ONDRAWCELL für Codebsp.
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Pierre
      
Beiträge: 138
Win 98se und XP prof
D5Pers und D7Prof
|
Verfasst: So 04.01.04 17:52
Hallo ,
1.
Daten als in ein Array oder anderes Feld und jeweils beim Wechseln der Position im Grid den neuen Bereich hineinladen.
2. OnTopLeftChange Ereignis im Objektmanager mit der Procedure TForm1.StringGrid1TopLeftChanged(sender: Tobject); verbinden
3. schau mal unter Procedure CleanGrd(grd:TStringGrid); nach
4. Stringgrid1.Options:=[.....hier....];
5. keine Ahnung;
6. Nein, so ganz weiss ich nicht, was Du meinst.
Gruß Pierre
|
|
Pierre
      
Beiträge: 138
Win 98se und XP prof
D5Pers und D7Prof
|
Verfasst: So 04.01.04 17:54
@Keldorn:
Da haben wir ja fast gleichzeitig an der Antwort gesessen.
Gruß Pierre
|
|
combocracker 
Hält's aus hier
Beiträge: 5
|
Verfasst: So 04.01.04 22:04
Vielen Dank für die Antworten.
| Keldorn hat folgendes geschrieben: |
und wenn du hier schon hier: www.delphipraxis.net...ndel+von+fragen.html
gefragt hast, warum 2x antworten? Hier zu drängeln und auch ohne im anderen thread geantwortet zu haben , finde ich schon ein wenig frech.
|
Das ist doch ein anderes Forum. Warum darf ich dort nicht dieselbe Frage stellen?!?!
Auch egal. Vielen Dank, Moritz.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 05.01.04 08:04
| combocracker hat folgendes geschrieben: | Vielen Dank für die Antworten.
Das ist doch ein anderes Forum. Warum darf ich dort nicht dieselbe Frage stellen?!?!
|
Gegenfrage: warum müssen sich mehrere Leute sich zeit nehmen und bemühen, dir zu antworten? langt es nicht zu wenn es einer macht?
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
combocracker 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 08.01.04 20:29
| Keldorn hat folgendes geschrieben: |
Gegenfrage: warum müssen sich mehrere Leute sich zeit nehmen und bemühen, dir zu antworten? langt es nicht zu wenn es einer macht? |
OK, möchte jetzt hier keinen Streit anfangen. Werde es nicht wieder tun. Obwohl du schon zugeben musst, dass einfach unterschiedliche Antworten hervorkommen.
Habe die bisherigen Sachen ziemlich gut hinbekommen. Nochmal Danke für die Antworten. Es stellen sich jetzt aber bei mir neue Fragen (denke mal, die passen immer noch in dieses Topic, da sie auch mit StringGrid zu tun haben):
a)  Zu TopLeftChanged: Wenn ich z.B. nach rechts scrolle, dann bleibt die Spalte ganz rechts frei und erst die zweite Spalte von rechts wird mit Inhalt gefüllt. Die ganz rechte Spalte bleibt weiß. Genauso verhält es sich mit dem Scrollen in andere Richtungen. Ist das normal?
b)  Ist es möglich zu einer bestimmten Zelle zu "springen"? Mein Stringgrid ist ja ziemlich groß und passt nicht ganz auf den Bildschirm, und es wäre cool, wenn es geht, dass ich z.B. sage "Gehe zu Zelle[200,300]" und dann automatisch zu dieser Zelle "gescrollt" wird.
Vielen Dank im Voraus (diesmal auch in nur ein Forum gepostet  ),
Gruß Moritz.
|
|
combocracker 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 08.01.04 21:43
| Zitat: | | Zitat: |
Wie male ich z.B. eine Ellipse in z.B. dem Feld (500/600). Habe ganz normal mit Canvas.Ellipse und dort die Pixelangaben eingegeben. Aber, wenn das Feld nicht sichtbar ist, dann erscheint die Ellipse immer oben links in meinem Programm. ;-( Dasselbe passiert bei TextOut. Wie erreiche ich es, dass Sachen in Felder gemalt werden, die nicht angezeigt werden? Also so, dass es gemalt wird und man dann erst dorthin scrollen muss, um es zu sehen.
|
du verwendest ondrawcell wahrscheinlich falsch. ohne ein paar Codeschnippsel kann man dir nicht weiterhelfen. such mal im Forum ONDRAWCELL für Codebsp.
Mfg Frank |
Meine Suche war leider erfolglos:
Hier die Zeile, die bei TopLeftChanged aufgerufen wird. (Ist jetzt ein Image und keine Ellipse, Problem ist aber gleich):
Quelltext 1: 2:
| Rectangle := DGridLililand.CellRect(X,Y); DGridLililand.Canvas.Draw(Rectangle.Left, Rectangle.Top, Image1.Picture.Graphic); |
Ich habe mir ein Array erstellt, in dem ich ein paar Koordinaten gespeichert habe, in die das Bild gezeichnet werden soll. Das Array laufe ich durch und daher kriege ich X und Y.
Wenn jetzt jedenfalls die Zelle, in die gezeichnet werden soll, gerade nicht auf dem Bildschirm zu sehen ist (weil das Grid so groß ist und nicht alles ohne scrollen angezeigt werden kann), dann wird das Image einfach in die linke obere Ecke des Stringgrids gezeichnet.  Wie kann ich das richtig machen?
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Fr 09.01.04 08:26
| combocracker hat folgendes geschrieben: | a) Zu TopLeftChanged: Wenn ich z.B. nach rechts scrolle, dann bleibt die Spalte ganz rechts frei und erst die zweite Spalte von rechts wird mit Inhalt gefüllt. Die ganz rechte Spalte bleibt weiß. Genauso verhält es sich mit dem Scrollen in andere Richtungen. Ist das normal?
|
hat sicherlich nichts mit dem ereignis zu tun. das ist einfach nur dazu da, das du mitbekommst, wenn der nutzer scrollt. Du kannst dann toprow und leftcol abfragen und weißt, wohin gescrollt wurde.
Wie bereits gesagt, vermute ich eher einen Fehler in deiner drawcell-Proc. aber ohne ein paar Codezeilen von dir habe ich keine Lust zu raten.
| Zitat: |
b) Ist es möglich zu einer bestimmten Zelle zu "springen"? Mein Stringgrid ist ja ziemlich groß und passt nicht ganz auf den Bildschirm, und es wäre cool, wenn es geht, dass ich z.B. sage "Gehe zu Zelle[200,300]" und dann automatisch zu dieser Zelle "gescrollt" wird.
|
einfach mal alle eigenschaften des grids in der OH durchlesen. da gibs col und row. Einfach diese Werte setzen und das grid scrollt von selbst hin. oder du nimmst dir noch toprow und leftcol zu hilfe, wenn du möchtest, das die zu markierende Zelle immer links oben ist.
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Fr 09.01.04 08:49
| combocracker hat folgendes geschrieben: |
Meine Suche war leider erfolglos:
Hier die Zeile, die bei TopLeftChanged aufgerufen wird. (Ist jetzt ein Image und keine Ellipse, Problem ist aber gleich):
Quelltext 1: 2:
| Rectangle := DGridLililand.CellRect(X,Y); DGridLililand.Canvas.Draw(Rectangle.Left, Rectangle.Top, Image1.Picture.Graphic); |
Ich habe mir ein Array erstellt, in dem ich ein paar Koordinaten gespeichert habe, in die das Bild gezeichnet werden soll. Das Array laufe ich durch und daher kriege ich X und Y.
Wenn jetzt jedenfalls die Zelle, in die gezeichnet werden soll, gerade nicht auf dem Bildschirm zu sehen ist (weil das Grid so groß ist und nicht alles ohne scrollen angezeigt werden kann), dann wird das Image einfach in die linke obere Ecke des Stringgrids gezeichnet. Wie kann ich das richtig machen? |
wenn du direkt ins grid zeichnest wird das eh nix. minimier dein Fenster und maximiers wieder - dann ist alles wieder weg. code zum Zeichnen gehört ins ondrawcellereignis, das für jede Zelle ausgelöst wird, wenn es nötig ist.
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
|