Autor Beitrag
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Di 01.10.02 15:47 
Hallo

Ich habe mir eine Variable vom Typ TStrings deklariert.
#
ausblenden Quelltext
1:
2:
3:
var
  Links2Add: TStrings;
  ...


Dann versuche ich in der gleichen Prozedur (nicht Funktion, falls wichtig sein sollte) drauf zuzugreifen:
ausblenden 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:
ausblenden Quelltext
1:
Links2Add := TStrings.Create;					


Dann sagt er mir aber, folgendes:
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

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

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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... :?!?: :nixweiss:

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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 01.10.02 17:32 
Hallo,

du kannst als Variablendeklaration tStrings stehen lassen aber erzeugen musst du dann tStringList:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:
ausblenden Quelltext
1:
FItems := TListBoxStrings.Create;					

wenn du dan nachschaust, was tListBoxStrings ist findest du folgendes Raus:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Di 01.10.02 19:53 
:idea:
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.... :P

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

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

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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, :D
Udontknow
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

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