Autor |
Beitrag |
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Di 01.10.02 15:47
Hallo
Ich habe mir eine Variable vom Typ TStrings deklariert.
# Quelltext 1: 2: 3:
| var Links2Add: TStrings; ... |
Dann versuche ich in der gleichen Prozedur (nicht Funktion, falls wichtig sein sollte) drauf zuzugreifen:
Quelltext 1:
| Links2Add.Add(IntToStr(currow)); |
wobei currow ein Integer ist.
So. Beim aufruf dieser Prozedur (nicht beim kompilieren, erst wenn ich diese eine Funktion aufrufe) sagt mir Delphi, daß ich eine "Access Violation" gemacht habe. Dann habe ich versucht gleich in der ersten Zeile (nach dem begin natürlich) der Prozedur die Variable zu createn:
Quelltext 1:
| Links2Add := TStrings.Create; |
Dann sagt er mir aber, folgendes:
Quelltext 1:
| [Warning] MainUnit.pas(182): Constructing instance of 'TStrings' containing abstract method 'TStrings.Clear' |
Das gleich geshieht zwei weitere Male nämlich mit "...abstract method 'TStrings.Delete'" und mit "TStrings-Insert".
Also egal wie ich's dreh' und wende, er sagt mir immer, daß ich etwas falsch mache.
In einer anderen Unit hingegen klappt ds wie am Schnürchen. Da deklariere ich die Variable vom Typ TStrings und weise dieser später den Inhalt einer Listbox zu. Dort funktioniert das, ohne Fehlermeldungen und sogar ohne, daß ich vorher mit
Quelltext 1:
| Variable := TStrings.Create |
das Ding create.
Kann mir da einer helfen?
Tschüß
Thomas
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
DeCodeGuru
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Di 01.10.02 16:38
such mal im Forum danach. Die Problematik wurde mehrmals schon besprochen. Aber ein Tipp: Probiers mit TStringlist.
_________________ Viele Grüße
Jakob
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Di 01.10.02 16:56
unter welchem Stichwort denn?
Ich geh mal bei den FAQs auf die Suche...
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Di 01.10.02 17:07
Hmmm, habe ein paar gefunden. Ist mir jetzt ein bisschen klarer. Dann werde ich wohl die StringList nehmen müssen.
Aber warum geht es in einer anderen Unit einwandfrei? Das ist mir irgendwie noch nciht klar...
Tschüß
Thomas
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Di 01.10.02 17:32
Hallo,
du kannst als Variablendeklaration tStrings stehen lassen aber erzeugen musst du dann tStringList:
Quelltext 1: 2: 3: 4: 5:
| VAR sl : tStrings; bagin sl := tStringList.Create; [...] |
Ich schätze das das in deinen anderen Units der Fall ist.
Gruß
Klabautermann
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Di 01.10.02 18:12
nö, in der anderen unit wird sie gar nicht created. Ich weise dem TStrings einfach die Strings aus 'nem anderen TStrings zu und dann habe ich darin die Zeichenketten, die ich auch in dem anderen habe.
Genauer formuliert:
list: TStrings;
list := Listbox.Strings
oder so ähnlich. Ob die Funktion Strings in der Listbox nun da ist, weiß ich nicht. Aber auf jeden Fall weise ich der vermeintlichen Liste die Strings aus einer Listbox zu. Klappt ganz gut...
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Di 01.10.02 19:39
Also wird sie von tListbox erzeugt.
Wenn du eine Pro version von hast kannst du dich ja ein wenig durch die Queltexte der Komponenten hangeln und zurückverfolgen, wo Strings von tListbox Herkommt.
Im Construktor von tCustomListBox findest du dann etwas wie:
Quelltext 1:
| FItems := TListBoxStrings.Create; |
wenn du dan nachschaust, was tListBoxStrings ist findest du folgendes Raus:
Quelltext 1:
| TListBoxStrings = class(TStrings) |
Es handelt sich also um einen nachfolger von tStrings in dem die benötigten funktionen Implementiert sind - nicht um tStrings selber.
Und nur damit keine beschwerden kommen, diese Zeile kannst du auch noch in dem Quelcode finden:
Quelltext 1:
| property Items: TStrings read FItems write SetItems; |
Wenn du also auf Items von tListbox zurgeist (Strings gibt es bei dieser nicht) verwendest du die Interne Variable FItems vom Typ TListBoxStrings.
Jedes Objekt muss erzeugt werden wenn man damit arbeiten will und niemand auch die Borländer nicht kann mit Abstrakten Kalssen arbeiten wie tStrings eine ist.
tStrings ist nur eine Art Prototyp und eine mögliche Implementierung stellt tStringList dar.
Gruß
Klabautermann
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Di 01.10.02 19:53
Da hab ich doch mal wieder was dazu gelernt
Aber die Pro habe ich nicht, nur die PE, also kann ich das nciht selbst überprüfen. Aber ich denke, daß ich dir glauben kann....
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mi 02.10.02 14:11
Hallo,
Nun habe ich alles auf die StringList umgestellt.
Aber ich habe ein Array of TStringList. Das brauche ich, da ich die Suchenfunktionen und so weiter von der StringList brauche. Ist einfach einfacher als im mehrdimensionalen Array alle Indezes zur durchsuchen (und einen CommaText gibt's bei Arrays ja auch nicht...). Wie Create ich jett diese Arrays? Ich habe im var-Befehl die Array einfach mit
Quelltext 1:
| myarray: array of TStringList; |
deklariert. Aber jetzt muss ich die ja auch noch mit dem TStringList.Create irgendwie erstellen. Muss ich da jeden Index einzelnd createn? Also inner Schleife? Das würde nämlich nicht gut gehen, da es ein dynamisches Array ist und sich die Anzahl der Indezes ja bei jedem Funktionsaufruf ändert (je nachdem was der Anwender ausgewählt hat). Kann man da nicht irgendwie sowas machen wie
Quelltext 1:
| myarray := array(TStringList.Create); |
Dieser code ist natürlich schwachsinn, aber gibt's irgendwas vergleichbares, sodaß alle Indezes als TStringList createt werden?
Tschüß
Thomas
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Udontknow
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 02.10.02 14:14
Hi!
Ein Tip am Rande: Jede Klasse gibt den Klassennamen über ihre Eigenschaft Classname vom Typ String heraus, wenn man sich also nicht sicher ist, was man da gerade bearbeitet, einfach mal STRG-F7 drücken und MeinObjekt.Classname abrufen.
Cu,
Udontknow
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 02.10.02 14:32
Hallo,
tommie-lie hat folgendes geschrieben: | Dieser code ist natürlich schwachsinn, aber gibt's irgendwas vergleichbares, sodaß alle Indezes als TStringList createt werden? |
Nein, das gibt es nicht. Du musst nach jeder vergrößerung des Arrays für die neuen Elemente tStrnigList.Cearte aufrufen und vor jeder Verkleinerung natürlich MyArray[x].Free.
Am Besten du schreibst dir eine Procedure daführ die das für dich erledigt. So dass du bei jeder änderung nur noch SetListArraySize(neueLaenge) oder so etwas aufrufen musst.
Gruß
Klabautermann
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mi 02.10.02 15:26
ist ja bescheuert.
Aber für meinen Zweck ist so eine Prozedur ja auch leicht gemacht, denn die Arraygröße ändert sich nicht während der Prozedur sondern nur am Anfang (und wird am Ende weder gefreed). Also kann ich einfach 'n Zähler setzen der mir einen Index nach dem anderen initialisiert.
Aber das wäre mal ein Vorschlag für Delphi8...
Eine erweiterung der Pascal-Sprche. Ist sowas aufwändig?
Tschüß
Thomas
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|