[Delphi] Structuur Unit

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

  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
IK heb een unit en het is de bedoeling dat in deze unit een aantal procedures public zijn en een aantal private zijn, om de een of andere reden lukt mij dit niet de structuur die ik nu heb ziet er zo uit:

Unit tekstverwerking

interface

uses comobj, wordobject,sysutils

procedure opstarten(project:boolean;sender:tobject); <----- moet public zijn

implementation

uses correspondentietekst,correspondentiedlg,datamodule,itemnrs;

var word2000:variant;
docomschrijving:string;
projectcode:string;
docaanmaker:string;
docaanmakercontact:string;

procedure informatie(project:boolean); <---- moet private zijn

{echte functionaliteit }

end.


De foutmelding die hij geeft is:

BEgin exepected but end fout en dan staat hij op de allerlaatste regelg, verder geeft hij aan dat de statement/external declaratoins niet goed zijn.

Wat doe ik fout?

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb


  • yodax
  • Registratie: Januari 2000
  • Laatst online: 28-04 08:47
Volgens mij mag je geen forward declaration doen in de implementation sectie van je unit.

(Oh en zover als ik weet kan je geen private functies maken in een unit, dit is voorbehouden aan een klasse)

[ Voor 0% gewijzigd door yodax op 03-09-2002 10:21 . Reden: Stukje toegevoegd ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
private en public zijn idd access modifiers voor in classes.

Als je een procedure tot die ene unit wilt beperken (dus niet zichtbaar in andere), dan moet je die procedure in het implementation deel schrijven en moet je dus ook de body van die functie daarin uitschrijven.

Waarom wil je dat eigenlijk doen?
Ga je de functies die je tot die ene unit wilt beperken dan enkel gebruiken binnen andere functies van die unit ofzo (die wel "public" zijn?)?

Je kunt het dan bv zo oplossen:
code:
1
2
3
4
5
6
7
8
procedure InterfaceProcedure();

  function ImplementationMethod() : string
  begin
  end;

begin
end;

Wel een beetje uit de losse pols....

https://fgheysels.github.io/


  • yodax
  • Registratie: Januari 2000
  • Laatst online: 28-04 08:47
code:
1
2
3
4
5
procedure informatie(project:boolean); <---- moet private zijn

{echte functionaliteit }

end.


Dus zal je hier de functie moeten implementeren en niet forward declareren. :) De foutmelding is namelijk dat je een begin mist, dat zal de begin van de implementation zijn van je funtie.

  • yodax
  • Registratie: Januari 2000
  • Laatst online: 28-04 08:47
Stiekem nog wat toevoegen he whoami ;) Heb ik ook nog een kleine toevoeging aan het stuk van een procedure binnen een procedure.

Hou er rekening mee dat als je op deze manier een functie defineert de parameters niet via het register worden door gegeven! Als je die functie dus vaak aanroept binnen een loop is dit veel trager dan de functie boven te declareren.

Overigens worden functie paramters alleen via het register doorgegeven als je minder als 3 parameters hebt.

  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
Misschien doe ik wel iets gigantisch fout hoor maar dit werkt niet:

unit Unit2;

interface

procedure hoofdprocedure(test:string);

implementation

procedure hoofdprocedure(test:string);
begin
subprocedure(test);
end;

procedure subprocedure(test:string);
begin
showmessage(test);
end;

end.

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
#define "Het werkt niet".

Glazen bollen worden niet meer gemaakt en zijn nergens meer te vinden.
Krijg je compiler errors? Doet het niet wat het moet doen? ...

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, hij kent subprocedure (nog) niet, omdat pascal een one-pass compiler is. Hij gaat maar 1x van boven naar beneden.

probeer het eens zo:

unit Unit2;

interface

procedure hoofdprocedure(test:string);

implementation

procedure subprocedure(test:string); forward;

procedure hoofdprocedure(test:string);
begin
subprocedure(test);
end;

procedure subprocedure(test:string);
begin
showmessage(test);
end;

end.

of

unit Unit2;

interface

procedure hoofdprocedure(test:string);

implementation

procedure subprocedure(test:string);
begin
showmessage(test);
end;

procedure hoofdprocedure(test:string);
begin
subprocedure(test);
end;

end.

Nu is subprocedure niet zichbaar (private) buiten de unit en hoofprocedure wel.

[ Voor 0% gewijzigd door LordLarry op 04-09-2002 09:14 . Reden: typo ]

We adore chaos because we like to restore order - M.C. Escher


  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
Het werkt, bedankt voor de oplossingen allemaal. Zitten er trouwens nog nadelen aan het forward declareren in een unit?

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

nee, geen nadelen

We adore chaos because we like to restore order - M.C. Escher


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:12

Creepy

Tactical Espionage Splatterer

hehe... het valt me op dat een hoop mensen die met Delphi beginnen hier moeite mee lijken te hebben. Ik kan je in dat geval aanraden om een goed Delphi boek, of beter nog een Pascal boek te kopen/lenen. Het gaat hierbij dus niet om het leren werken met/in Delphi, maar puur om het syntaxtische verhaal van (Object) Pascal, waarmee in Delphi wordt gewerkt.

"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


  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
Ik ben geen beginner in delphi, maar ik probeer een door mij reeds gebouwd programma te tunen/af te schermen en kom nu dus probleempjes tegen die mij nooit eerder opgevallen zijn

Nog ff een vraagje waarom mag je een buttonclick in een class niet private maken?

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
marenk_vos schreef op 04 september 2002 @ 12:38:
Ik ben geen beginner in delphi, maar ik probeer een door mij reeds gebouwd programma te tunen/af te schermen en kom nu dus probleempjes tegen die mij nooit eerder opgevallen zijn

Nog ff een vraagje waarom mag je een buttonclick in een class niet private maken?


Volgens mij mag je hem private maken. Uw programma blijft dan gewoon werken.
Als hij echter 'published' is, kan je er ook vanaf een andere form aan.
(Althans, zo heb ik het begrepen.).

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je mag m wel private maken, maar dan gaat ie niet werken via de property editor :)

Die heeft RTTI nodig en dat wordt default alleen aangemaakt voor published properties. Je kan m wel runtime zetten Button1.OnClick := Button1Click;

We adore chaos because we like to restore order - M.C. Escher


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 20:22

Reptile209

- gers -

't Lijkt me wel logischer om een Click-procedure published te maken: het zal immers meestal zo zijn dat een andere class/event de Click aanroept dan dat dat binnen de Button-class gebeurt. Published dus.

Zo scherp als een voetbal!


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dat is niet waar die het over heeft. Hij heeft het over of ie een OnClick functie (Button1Click) , die default published wordt, ook private kan maken. Niet de Click functie van de Button zelf.

We adore chaos because we like to restore order - M.C. Escher


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:12

Creepy

Tactical Espionage Splatterer

marenk_vos schreef op 04 september 2002 @ 12:38:
Ik ben geen beginner in delphi, maar ik probeer een door mij reeds gebouwd programma te tunen/af te schermen en kom nu dus probleempjes tegen die mij nooit eerder opgevallen zijn

Nog ff een vraagje waarom mag je een buttonclick in een class niet private maken?
Ach.. wie bepaald wie een beginner is en wie niet?? ;)))

Het "private" en "public" maken van functies is voor mij 1 van de eerste dingen die ik leerde (scope van variabelen, maar ook functies/procedures) toen ik Pascal leerde programmeren. Het is een basis iets van Pascal. Een hoop mensen die met Delphi bezig zijn, kennen Delphi wel, en "toevallig" Pascal omdat bij Delphi hoort.

Vandaar dat ik zei "beginner". De IDE kennen, terwijl je basis dingen van de gebruikte taal niet helemaal beheerst maakt iemand voor mij een beginner... NOFI natuurlijk!

"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


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Creepy schreef op 04 september 2002 @ 16:25:
[...]

Ach.. wie bepaald wie een beginner is en wie niet?? ;)))

Het "private" en "public" maken van functies is voor mij 1 van de eerste dingen die ik leerde (scope van variabelen, maar ook functies/procedures) toen ik Pascal leerde programmeren. Het is een basis iets van Pascal. De hoop mensen die met Delphi bezig zijn, kennen Delphi wel, en "toevallig" Pascal omdat bij Delphi hoort.

Vandaar dat ik zei "beginner". Je IDE kennen, terwijl je basis dingen van de gebruikte taal niet helemaal beheerst maakt iemand voor mij een beginner... NOFI natuurlijk!


Hmm... IK geloof dat de TS zijn vraag niets te maken had met het al dan niet private of public zijn. De functie die aan het OnClick event van een button hangt, heeft nl. de access modifier 'published' (Borland specifiek).
In de Delphi help staat er volgens mij zo iets dat die functie niet de access modifier private mag meekrijgen.

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Voor de volledigheid dan:

Je mag TButton.OnClick zelf best private maken, maar dan onthoud ie (default) niet aan welke functie jij m verbind als je er al bij kan vanuit een andere klasse.

Ook TButton.Click mag je private maken. Dan werkt alles nog gewoon, je kan alleen niet op die manier vanuit een andere klasse dan de Click functie aanroepen.

En om mezelf maar even te herhalen :)
De functie die je verbind aan een TButton.OnClick maakt de property editor default published. Dat is nodig omdat Delphi anders bij het laden van het form de functie niet kan vinden (ivm RTTI). Je kan m dus wel private maken, maar dan moet je m runtime zetten.

We adore chaos because we like to restore order - M.C. Escher


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:12

Creepy

Tactical Espionage Splatterer

whoami schreef op 04 september 2002 @ 16:30:

[...]


Hmm... IK geloof dat de TS zijn vraag niets te maken had met het al dan niet private of public zijn. De functie die aan het OnClick event van een button hangt, heeft nl. de access modifier 'published' (Borland specifiek).
In de Delphi help staat er volgens mij zo iets dat die functie niet de access modifier private mag meekrijgen.
Ik praat in termen van public en private omdat de TS ook zo begon, en het eigenlijk had over de scope waarin z'n functies aanroepbaar zijn (verschil tussen interface en implementation deel in een unit) (procedure opstarten en procedure informatie).

"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

Pagina: 1