[Delphi] TStrings property van component wordt niet gezet

Pagina: 1
Acties:
  • 196 views sinds 30-01-2008
  • Reageer

  • porn*
  • Registratie: Januari 2001
  • Laatst online: 17-08 14:22

porn*

...take on the world!

Topicstarter
Ik ben een component aan het schrijven in Delphi 6, en heb de volgende property in mijn published staan:
code:
1
    property    ValidList:  TStrings          read FvalidList write SetValidList;


De procedure SetValidList ziet er zo uit:
code:
1
2
3
4
procedure TMessenger.setValidList(newValidList: TStrings);
begin
  FvalidList.Assign(newValidList);
end;


Als ik nu iets vanuit de object inspector wil veranderen aan die list, krijg ik de melding "Cannot assign a nil to a TRichEditStrings". Ik hoopte eigenlijk dat die assign gewoon zou werken, maar dat doet hij dus niet. Ik heb het volgende topic gevonden: [rml][ Delphi] Published property probleem[/rml], dat over hetzelfde probleem gaat. Helaas staat daar precies hetzelfde als mijn code, en die werkt dus niet.
Tevens heb ik even afgekeken hoe dat bijv. bij een TMemo gaat (property Lines is ook TStrings) en daar doen ze hetzelfde, met als verschil dat hun TStrings is gemaakt dmv. een andere klasse, TMemoStrings. Ik kan die echter niet op dezelfde manier gebruiken.

Iemand een suggestie?

Bnet pindle#2913


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:28

Creepy

Tactical Espionage Splatterer

Ja.. FValidList is een object, die moet je natuurlijk wel instantieren (aanmaken, create..)

[ Voor 8% gewijzigd door Creepy op 05-02-2003 12:43 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • porn*
  • Registratie: Januari 2001
  • Laatst online: 17-08 14:22

porn*

...take on the world!

Topicstarter
Dat is uiteraard gebeurd in de constructor van het component, ook wordt hij netjes vrijgegeven in de destructor.

[ Voor 1% gewijzigd door porn* op 05-02-2003 13:11 . Reden: Typo ]

Bnet pindle#2913


Verwijderd

Stomme vraag mar waarom gebruik je TStrings; bij mijn weten is dat een abstract-object en valt die niet echt lekker te gebruiken; zonder dat je de methods override van dit object voor o.a. Add/Delete etc.

Dus ik denk dat je het eens moet proberen met TStringList...

[ Voor 74% gewijzigd door Verwijderd op 05-02-2003 13:22 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23:22

Tomatoman

Fulltime prutser

De code die je hebt geschreven is goed als je de volgende randvoorwaarden in acht neemt.
  • Je roept setValidList aan met als parameter een instantie van een TStrings, dus niet met nil.
  • FvalidList is al geïnstantieerd (je hebt een object gecreëerd), bijvoorbeeld met FvalidList := TStringList.Create;
  • TStrings is een abstracte klasse, dus je moet een descendant van TStrings instantiëren en niet TStrings zelf. Dus:
    Delphi:
    1
    2
    3
    4
    5
    6
    
    var
      Strings: TStrings;
    begin
    { Strings := TStrings.Create; }   // FOUT!
      Strings := TStringList.Create;  // goed
    end;

Een goede grap mag vrienden kosten.


Verwijderd

Haha Je was me voor tomatoman :)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23:22

Tomatoman

Fulltime prutser

Verwijderd schreef op 05 February 2003 @ 13:23:
Haha Je was me voor tomatoman :)
En dat nog wel bij je eerste posting :) ! Welkom in Programming & Webscripting.

[ Voor 2% gewijzigd door Tomatoman op 05-02-2003 13:38 . Reden: Bug: :)! geeft geen smiley ]

Een goede grap mag vrienden kosten.


  • porn*
  • Registratie: Januari 2001
  • Laatst online: 17-08 14:22

porn*

...take on the world!

Topicstarter
Ik gebruik dus ook een TStringlist:

Delphi:
1
2
3
4
5
6
7
8
constructor TMessenger.Create;
begin
  {Inherit default create from TComponent}
  inherited Create(Self);
  {Set 5211 as default port}
  Fport := 5211;
  FvalidList := TStringList.Create;
end;


offtopic:
Leuk trouwens die verschillende code-types, was me nog niet opgevallen ;)


Edit: kun je zelfs wel een object maken van een TStrings? Ik dacht van niet... Maja anyway hij wil 't nog niet echt pikken :|

[ Voor 16% gewijzigd door porn* op 05-02-2003 13:44 ]

Bnet pindle#2913


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:28

Creepy

Tactical Espionage Splatterer

Hmm, aan de foutmelding te zien lijkt het erop dat de stringlist die je opgeeft aan je assign nil is. En nil kan niet worden geassigned aan een stringlist. Weet je zeker dat de stringlist die je meegeeft in setvalidlist is gevuld?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • porn*
  • Registratie: Januari 2001
  • Laatst online: 17-08 14:22

porn*

...take on the world!

Topicstarter
Nou, ik check hem inmiddels sowieso vantevoren met:
Delphi:
1
 If Assigned(newValidList) then FvalidList.Assign(newValidList);


Je zou dus haast zeggen "ja", want ik krijg de melding nog steeds, en als het nil was zou hij niet in de if komen. Maar ik weet niet precies hoe Delphi omgaat met een TStrings-property van een component. Ik krijg namelijk de melding al als ik op de drie puntjes druk (zoals bij een memofield, waarna je een popup krijgt waar je de strings in kunt vullen).

Bnet pindle#2913


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:28

Creepy

Tactical Espionage Splatterer

Probeer anders eens de .addstrings method.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Je doet het idd volgens het boekje, dus het zou in feite goed moeten gaan.

Maarja, het gaat dus niet goed :)
Wat als je nou es iets van ShowMessage(Value.ClassName) in die SetValidList zet, dan krijg je te zien wat ie nou eigenlijk aan je property probeert toe te kennen.

日本!🎌


  • porn*
  • Registratie: Januari 2001
  • Laatst online: 17-08 14:22

porn*

...take on the world!

Topicstarter
Heeft beiden geen effect, want, en nu komt het leuke deel (of eigenlijk niet...), zelfs al vul ik de setValidList-functie NIET in, ik krijg al meteen een error als ik op de drie puntjes van de property klik. Dus wat gaat er in godsnaam fout?

Bnet pindle#2913


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23:22

Tomatoman

Fulltime prutser

De Object Inspector haalt eerst de huidige waarde van de property op en ik vermoed dat het daar al fout gaat. Instantieer je die ValidList eigenlijk wel in de constructor?

Een goede grap mag vrienden kosten.


  • porn*
  • Registratie: Januari 2001
  • Laatst online: 17-08 14:22

porn*

...take on the world!

Topicstarter
Uiteraard is dat gebeurd. Maar het is al opgelost :D

Wat het nou was weet ik niet, maar ik heb het component opnieuw aangemaakt, de bestaande code ge-copy-paste'd, opnieuw in het package gezet en gecompileerd, en warempel werkt het ineens prima.

Computers.... zucht ;)

Bnet pindle#2913


Verwijderd

Logica is ver te zoeken ;)
Pagina: 1