| |
Anzeigen |
|
|
Social Bookmark Script |
|
|
|
 |
Erzeugen eines Arrays zur Laufzeit |
Ditte
Foren As
   

Dabei seit: 23.07.2007
Beiträge: 77
Einsatzart von VDF: gewerblich Anwenderstatus: Programmierprofi Herkunft: Berlin Betriebssystem: XP,Win7,Win Serv2003,2008
 |
|
| Erzeugen eines Arrays zur Laufzeit |
 |
Hi,
es ist eine gängige Methode Objekte zur Laufzeit zu erzeugen und nach Benutzung zu killen. Bei Com Objekten sowie bei XML ist ja fast Standard.
- bei mir leider noch nicht - soll es aber -
wie kann ich ein structuriertes Array zur Laufzeit erzeugen und auch wieder zerstören, wenn ich es nicht mehr brauche.
Im Kopf der View wird es global, das heißt wenn ich die View beende, bleibt das array und belegt Speicherplatz.
Struct gst_lvpdok //struct für array
String ls_dokpfad
Integer li_lvpos
String ls_name
String ls_datum
Integer li_po_eing
End_Struct
gst_lvpdok[] ga_lvpdok
Habe nirgends ein Beispiel dafür gefunden.
Auch wenn ich ein Button zur Laufzeit bilde
z.Bsp.:
Get create U_Array to hoData
wie kann ich diesem Button zuordnen, das es beim Click
zB.: send info_box "Hallo" sendet.
Muß ich vorher erst eine neue Klasse bilden:
Class HilfeButton is a button
....
Procedure OnClick
send info_box "Hallo"
end_procedure
end_class
Wer hat da Erfahrung oder kann mir ein Beispiel zeigen, dass ich nachvollziehen kann?
__________________ Dittmar
|
|
20.02.2008 16:32 |
|
|
Matthias
Super Moderator
   
Dabei seit: 09.07.2007
Beiträge: 233
Einsatzart von VDF: gewerblich Anwenderstatus: VDF-Entwickler Herkunft: Niedernhausen Betriebssystem: XP, Vista, Win7, 2008 Ser
 |
|
| RE: Erzeugen eines Arrays zur Laufzeit |
 |
Hallo Dittmar,
ich wüsste nicht, wie man die neuen Arrays (die keine Objekte sind, sondern Datentypen sind) zur Laufzeit erzeugen kann. Außer halt, man definiert eins. Oder wie definierst Du eine Integer Variable zur Laufzeit?
Eine "gebrauchtes" Array kann man wieder leer machen, indem man einfach 2 Variablen vom gleichen Datentyp deklariert
String[] sLeerArray sMyArray
...
Move sLeerArray to sMyArray
Bei der dynamischen Objekt-Generierung musst Du bereits die gesamte Funktionalität in der Klasse definiert haben. Also, Dein Beispiel mit der Info_Box ist da genau richtig.
Viele Grüße
Matthias
|
|
22.02.2008 10:48 |
|
|
abraxas
Doppel-As
Dabei seit: 23.07.2007
Beiträge: 107
Einsatzart von VDF: gewerblich Anwenderstatus: VDF-Entwickler Herkunft: Frauenfeld (CH)
 |
|
| RE: Erzeugen eines Arrays zur Laufzeit |
 |
Dittmar
Bin nicht ganz schlau geworden was du bezwecken willst resp. wo das Problem liegt.
Der Gebrauch von Array Objekten (is an array) sollte vermieden werden, da man ja nun mit [] einen Array eines beliebigen Datentyps erstellen kann (auch auf Basis von structs).
Lokale variablen - auch arrays - werden nach beenden der Prozedur 'zerstört' und der Speicher wird dann auch freigegeben. Das kann wohl kein Problem sein. Für Globale Variable gilt das aber nicht.
Wenn Du eine Objekt mit "get create U_array to hArray" erstellst, dann solltest Du es immer irgendwann mit "send destroy of hArray" wieder flach machen, ansonsten ja das Objekt bis zum Beenden der Applikation weiterlebt und Speicher braucht. Wie Matthias sagt, muss alle Funktionalität in der Class bereits vorhanden sein. Da man nur ein Handle hat, kann man nur properties setzen. Beim Button kannst Du durchaus das Label, aber auch das Property 'Message' zur Laufzeit verändern. Mit 'message' kannst Du natürlich eine Methode zuweisen, die in einem Parent Objekt definert ist.
Wenn du einen Array nicht nur lokal innerhalb einer Prozedur brauchst, sondern innerhalb einer Objektsruktur (z.b lokal innerhalb des Views), dann musst Du ein Property definierten auf der gewünschten Ebene (Bsp dbView) und den aktuell gültigen Wert jeweils holen/zurückschreiben.
das meine ich so:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
|
Object V is a cObject //
Property integer[] piaListe
procedure FuelleMich
integer[] iaTemp
integer iLcv
For iLcv from 1 to 1000
move iLcv to iaTemp[SizeOfArray(iaTemp)]
Loop
set piaListe to iaTemp
End_procedure
procedure ZeigeMich
integer[] iaTemp
integer iLcv
For iLcv from 0 to [SizeOfArray(iaTemp)-1]
showln iaTemp[iLcv]
Loop
set piaListe to iaTemp
End_procedure
// Array ändern und speichern im View Prop
Procedure MacheWas
integer[] iaTemp
integer iLcv
get piaListe to iaTemp
for iLcv from 0 to (sizeofarray(iaTemp)-1)
move (iaTemp[iLcv]*2) to iaTemp[iLcv]
Loop
set piaListe to iaTemp
End_procedure
// Beim deaktivieren des Views das Property leeren und somit Speicher freigeben
Procedure deactivating
integer[] iaTemp
get piaListe to iaTemp
move (resizeArray(iaTemp,0)) to iaTemp // Schwachsinn, aber so leer man offiziell einen array. Man könnte den "set" unten direkt machen
set piaListe to iaTemp
Forward send deactivating
End_procedure
Procedure Test
send FuelleMich
send ZeigeMich
send MachWas
send zeigeMich
End_procedure
End_Object
send Test to V
|
|
Ich muss gestehen, dass ich arrays und structs lieben gelernt habe...
Paolo
__________________ =================
Abraxas Informatik AG
Schweiz
=================
|
|
27.02.2008 16:33 |
|
|
Ditte
Foren As
   

Dabei seit: 23.07.2007
Beiträge: 77
Einsatzart von VDF: gewerblich Anwenderstatus: Programmierprofi Herkunft: Berlin Betriebssystem: XP,Win7,Win Serv2003,2008
Themenstarter
 |
|
| RE: Erzeugen eines Arrays zur Laufzeit |
 |
Hallo abraxas,
das war sehr ausführlich. Die alte Version "is a array" benutze ich nicht mehr.
Mir war nur aufgefallen (ähnliches Beispiel aus Hilfe) das ich nach beenden der View und den irgend wann wieder öffnen (das Array piaListe noch gefüllt sein mußte, ich habe das array geholt in "iatemp") alle Daten noch da waren.
Also beim Verlassen auf jeden Fall leer machen
move (resizeArray(iaTemp,0)) to iaTemp
set piaListe to iaTemp
den das pialiste scheint weiter im Speicher zu bleiben
Da mein Programm nun schon sehr groß ist, habe ich mir schon Gedanken bezüglich des Speichers gemacht.
***************************************
Zum Beispiel Button:
Ich definiere eine Klasse
Class myButton is a button
...
Procedure OnClick
send info_box "Hallo"
end_procedure
end_class
Im Programm kann ich das Button dan mit
get create u_mybutton to hmybutton
erzeugen.
Die Property kann ich dann so setzen:
set label of hmybutton to "das Label"
Und die message onclick?
procedure onclick of hmybutton ?????
Regards
Dittmar
__________________ Dittmar
|
|
27.02.2008 18:10 |
|
|
abraxas
Doppel-As
Dabei seit: 23.07.2007
Beiträge: 107
Einsatzart von VDF: gewerblich Anwenderstatus: VDF-Entwickler Herkunft: Frauenfeld (CH)
 |
|
| RE: Erzeugen eines Arrays zur Laufzeit |
 |
Dittmar
Natürlich bleibt der Inhalt von piaListe im Speicher, da es ja ein Property ist. Es würde erst geleert werden, wenn das Object, zu dem es das Property gehört destroyed würde.
Man kann durchaus ein Z.b. eine View wieder zerstören. Dann hättest Du im Prinzip den Zustand, dass nur Views, die sichtbar sind auch exstieren und dementsprechend Platz brauchen. Dieses Prinzip wird bei den Selectionslist angewendet, die nach dem Schliessen wieder zerstört werden (schau in dfdafmac.pkg -> cd_client nach).
Ich rate Dir aber davon ab, denn die Schwierigkeit bei den Views ist der korrekte Zeitpunkt für das destroy, da Views nicht modal sind.
Die Onclick Message wird standardmässig gesetzt/ausgeführt, sodass deine Button Klasse eigentlich "Hallo" melden müsste wenn du darauf klickst (siehe Klasse 'Button' in windows.pkg)
Hier setze ich eine Message auf den Button die NICHT in der Klasse definiert ist
procedure MyAction // irgendwo auf gleicher ebene oder in einem parent object
send Stop_Box "Hallo Welt"
End_procedure
Procedure Test
handle hmybutton
get create u_mybutton to hmybutton
set message of hmybutton item 0 to msg_MyAction // Beachte das MSG_ das ist der interne Name. Jede Message wird so vom compiler umgesetzt. Funktionen entsprechend GET_
send KeyAction of hMyButton // Klickt auf den Button !!
send destroy of hmyButton
End_procedure
send Test
Gruss, Paolo
__________________ =================
Abraxas Informatik AG
Schweiz
=================
|
|
28.02.2008 08:44 |
|
|
Ditte
Foren As
   

Dabei seit: 23.07.2007
Beiträge: 77
Einsatzart von VDF: gewerblich Anwenderstatus: Programmierprofi Herkunft: Berlin Betriebssystem: XP,Win7,Win Serv2003,2008
Themenstarter
 |
|
| RE: Erzeugen eines Arrays zur Laufzeit |
 |
Hallo Paolo,
der Nebel bei dem arrays ist jetzt weg.
Ich werde den Speicherinhalt der properties löschen wenn ich die Views schließe.
Nochmal zum Erzeugen von Objekten zur Laufzeit:
Mein Testobjekt meldet natürlich "Hallo", soweit so gut.
Wenn ich eine Klasse vorher definiere ist alles klar.
Wenn ich ein Objekt zur Laufzeit erzeuge, kann ich die Proceduren und Functionen zur Laufzeit entsprechend ändern, erweitern usw.
Mein Beispiel:
Object oButton is a mybutton
...
procedure onclick
send send info_box "Paolo"
end_procedure
end_object
würde mir beim Click statt "Hallo" -> "Paolo" auf dem Monitor anzeigen.
nun erzeuge ich das Objekt zur Laufzeit und will das Gleiche erreichen:
Procedure neue_Action
send send info_box "Paolo"
end_procedure
Procedure Test
handle hmybutton
get create u_mybutton to hmybutton /ist klar
set message of hmybutton item 0 to msg_neue_Action
send KeyAction of hMyButton // Nun erscheint "Paolo"
send destroy of hmyButton
End_procedure
send Test
Ich glaube jetzt habe ich es verstanden.
Das Beispiel Button, war ja nur zum allg. Verständnis für mich.
Wann wendet man so etwas sinnvoller Weise an?
Gruss
__________________ Dittmar
|
|
28.02.2008 11:07 |
|
|
abraxas
Doppel-As
Dabei seit: 23.07.2007
Beiträge: 107
Einsatzart von VDF: gewerblich Anwenderstatus: VDF-Entwickler Herkunft: Frauenfeld (CH)
 |
|
| RE: Erzeugen eines Arrays zur Laufzeit |
 |
Dittmar
Sinnvolle Anwendungen (Du meinst wohl das mit dem "get create") ergeben sich bald einmal. Ein klassisches Beispiel beim uns ist, dass die File Dialogs immer on the fly erstellt und zerstört werden. Das erspart einem das definieren des entsprechenden Objektes in der ganzen View Struktur. Den Dialog braucht man nur kurz. In meinen Beispiel unten wird zusätzlich noch eine Instanz einer DD Klasse erstellt und dann ein Export durchgeführt. (anderes Beispiel: INI-Files).
Das schöne hieran ist, dass der gesamte Ablauf in einer Methode Platz hat. Die Benutzung dieser Methode ist somit jederzeit an jedem Ort möglich man muss nur dafür sorgen, dass man die Methode aufrufen kann. Man muss sich dann weder darum kümmern, das korrekte DD noch den SaveAsDlg zu instanzieren.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
|
Procedure DoExportLanguage
String sFile
Handle hDlg hoDD
Boolean bOk
Get create U_SaveAsDialog to hDlg
Set Filter_String of hDlg to "xml|*.xml"
Set file_Title of hDlg to "language.xml"
Set NoChangeDir_State of hDlg to True
Get Show_Dialog of hDlg to bOk
If (bOk) Begin
Get file_name of hDlg to sFile
Send Destroy of hDlg
Get Create U_Language_DataDictionary to hoDD
Send DoExportLanguage_XML of hoDD sFile
Send Destroy of hoDD
End
End_Procedure
|
|
Gruss, Paolo
__________________ =================
Abraxas Informatik AG
Schweiz
=================
|
|
28.02.2008 11:27 |
|
|
Ditte
Foren As
   

Dabei seit: 23.07.2007
Beiträge: 77
Einsatzart von VDF: gewerblich Anwenderstatus: Programmierprofi Herkunft: Berlin Betriebssystem: XP,Win7,Win Serv2003,2008
Themenstarter
 |
|
| RE: Erzeugen eines Arrays zur Laufzeit |
 |
Danke Paolo,
wenn man nicht weiss wozu man es verwenden kann, wird man es nie nutzen.
Und wer weiss schon, was man da alles verpaßt.
Gruss
__________________ Dittmar
|
|
28.02.2008 11:40 |
|
|
|
|
|
 |
|