| Autor |
Nachricht |
Peter18
      
Beiträge: 107
Delphi4
|
Verfasst: Do 12.01.12 18:23
Komponente: TStringGrid
Ein freundliches Hallo an alle,
ich hoffe jemand kann folgenden Effekt erklären:
Ich möchte den Inhalt bestimmter Reihen eines StringGrids in ein anderes übertragen. Natürlich kann ich in einer Schleife Zelle für Zelle übertragen. Eleganter ist es aber eine ganze Zeile als CommaText zu übertragen. Einlesen aus einer Datei (CommaText) und speichern klappt hervorragend.
Wenn ich aber
zuweise, werden leere Zellen mit dem Inhalt der nächsten nicht leeren Zelle gefüllt. Auch der Umweg über eine Stringvariable funktioniert nicht. Ebensowenig Copy. Es bleibt bei dem Ergebnis: Die Daten rücken auf und die Zellen am Ende bleiben leer. Es sieht so aus, als ob die Kommata herausgefiltert werden.
Kann jemand Helfen? Dank Euch im voraus, auch fürs Bemühen
Grüße
Peter
|
| |
|
|
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
|
|
Tranx
       
Beiträge: 308
Erhaltene Danke: 22
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Do 12.01.12 19:08
Hallo, ich habe es getestet, bei mir funktioniert das wie gewünscht.
Es werden die Einträge der einzelnen Zellen exakt 1 zu 1 übertragen. Hätte ich auch bei der Eigenschaft Kommatext nicht anders erwartet, da sie zu der TStrings-Komponente (u.a. Rows) gehört. P.S. ich habe Delphi 5.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
| |
|
|
jaenicke
      
Beiträge: 15841
Erhaltene Danke: 741
XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
|
Verfasst: Do 12.01.12 20:15
Die Fragestellung klingt nach einem typischen Fall von einer GUI, die gleichzeitig als Datenspeicher missbraucht wird...
Wenn du die Daten im Hintergrund in geeigneten Datenstrukturen halten würdest, könntest du auch direkt damit arbeiten statt mit dem TStringGrid. Und wenn du es dir ganz einfach machenn willst, nimm einfach die VirtualTrees. Die sind schneller, sehen besser aus, ...
// EDIT:
Gibt es eigentlich nur CommaText und nicht auch direkt Text? 
|
| |
|
|
Tranx
       
Beiträge: 308
Erhaltene Danke: 22
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Fr 13.01.12 09:19
Trotz allem verstehe ich nicht, wieso das bei mir - bei einem einfachen Programm, dass ich eben mal schrieb - ohne Probleme klappte, und bei ihm scheinbar nicht. Vielleicht wäre da mehr Info sinnvoll, um den Fehler einzugrenzen. Und es kann ja sein, dass er das Stringgrid für Eingaben benötigt, welche im Programm erfolgen, und die dann übertragen werden. Wenn alles in Datenstrukturen alleine verarbeitet wird, wozu benötigt man dann noch TStringgrid? Manche Anwendungen haben eben keine durchgehend gleiche Datenstruktur. Da kann es schon sein, dass ein Stringgrid sinnvoll ist. Aber unabhängig davon - die Frage ist doch - inwieweit diese Diskrepanz erklärbar ist.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
| |
|
|
jaenicke
      
Beiträge: 15841
Erhaltene Danke: 741
XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
|
Verfasst: Fr 13.01.12 09:48
Tranx hat folgendes geschrieben : | | Wenn alles in Datenstrukturen alleine verarbeitet wird, wozu benötigt man dann noch TStringgrid? |
Zur Eingabe und Anzeige. Ausschließlich dafür sind visuelle Komponenten da.
Bei mir funktioniert es aber auch problemlos.
Nichtsdestotrotz stellt sich die Frage warum dieser umständliche Weg sein muss... Egal ob man nun findet, dass das eleganter aussieht oder nicht, sehr langsam ist es in jedem Fall. Denn hier wird erst in CommaText ein String mit Kommata zusammengebastelt, dann beim Zuweisen der Inhalt der Zeile gelöscht, die Zelleninhalte auseinanderklamüsert und wieder in die Zellen eingefügt.
Stattdessen wäre es viel einfacher direkt die einzelnen Strings den Zellen (sprich Einträgen der Stringliste der Zeile) zuzuweisen. Das geht viel schneller und sieht auch für meine Begriffe eleganter aus:
|
| |
|
|
Peter18 
      
Beiträge: 107
Delphi4
|
Verfasst: Fr 13.01.12 11:55
Hallo,
Dank euch allen!
Hallo Tranx, ganz verstehe ich es auch nicht, aber ich vermute, dass es mit der Länge des Strings zusammen hängt. In diesem Fall sind auch mehrere Pfade auf Dateien enthalten und damit ist die Summe der Zeichen größer 255. Dennoch kann ich die Daten aus einer Datei lesen und dem Grid ohne eigene Auswertung als CommaText zuweisen. Die Daten stehen dann in den richtigen Zellen.
Hallo jaenicke,
| jaenicke hat folgendes geschrieben: | | Die Fragestellung klingt nach einem typischen Fall von einer GUI, die gleichzeitig als Datenspeicher missbraucht wird... |
in diesem Fall dient das Grid zur Anzeige und Bearbeitung, aber auch zum zwischenspeichern. Assign funktioniert einwandfrei! Werden die Strings dabei kopiert, oder nur ein Pointer eingetragen?
Du erwähntest VirtualTrees. Die habe ich bei Delphi 4 noch nicht gesehen.
Eine Lösung habe ich jetzt, würde nur gern verstehen, warum dieser Effekt auftritt.
Grüße von der Nordsee
Peter
|
| |
|
|
jaenicke
      
Beiträge: 15841
Erhaltene Danke: 741
XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
|
Verfasst: Fr 13.01.12 12:57
|
| |
|
|
Narses
       

Beiträge: 8371
Erhaltene Danke: 244
W2k, WXPpro
TP3 - D7pro
|
Verfasst: Fr 13.01.12 14:53
Moin!
jaenicke hat folgendes geschrieben : | Peter18 hat folgendes geschrieben : | | Assign funktioniert einwandfrei! Werden die Strings dabei kopiert, oder nur ein Pointer eingetragen? | Die Strings werden kopiert. Aber in neueren Delphiversionen zumindest werden dabei keine weiteren Stringoperationen ausgeführt, da eine TStringList intern nur ein Array von Records mit jeweils der Zeile (bzw. ggf. Name und Wert der Zeile) und dem zugeordneten Objekt ist. |
Also dass die Strings auf dem Heap dupliziert werden (=weiterer Speicher alloziert wird) glaube ich erst, wenn ich den Assembler-Dump gesehen habe. AFAIR wird in jeder Delphi-Version mit langen Strings nur der Referenz-Zähler erhöht (deshalb gibt es ja UniqueString als Funktion).  Ich glaube, da schlägt bei dir mal eher wieder die "alte Delphi-Version"-Aversion zu...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Für diesen Beitrag haben gedankt: Martok
|
| |
|
|
Peter18 
      
Beiträge: 107
Delphi4
|
Verfasst: Fr 13.01.12 15:43
Hallo jaenicke, hallo Narses,
Dank euch beiden!
| jaenicke hat folgendes geschrieben: | | Sieht der String für die Zeilen denn noch korrekt aus? |
Ich habe den CommaText einer Variablen zugewiesen und die sah einwandfrei aus. Seltsamer Weise klappt es auch beim Einlesen aus einer Datei. Nur von Grid zu Grid tritt dieser Effekt auf. Werd dann wohl mal in die Assembler-Gruften hinabsteigen müssen, wenn ich mal etwas Zeit habe.
Falls es jemand vor mir tut bin ich für eine Info dankbar.
Güße von der Nordsee im April (oder ist doch noch Januar?)
Peter
|
| |
|
|
jaenicke
      
Beiträge: 15841
Erhaltene Danke: 741
XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
|
Verfasst: Fr 13.01.12 17:49
|
| |
|
|
|