Visual Dataflex
Zur Startseite Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen
Datenbank RSS Feed Selector Zur User-Map

 
Boardmenü
» Forum
» Portal

» Registrieren
» Suche
» Statistik
» Mitglieder
» Team
» Kalender
» Sponsoren
» Partner

» F.A.Q

Portalmenü
» Datenbank anlegen
» Datenbank Entwicklung
» Empfehlungen
» Portal
» Programm erstellen
» Über visual Dataflex

» Statistik

Dataflex Empfehlungen

Englisches Dataflex Forum


Anzeigen

Sponsoren
Kostenloser Linktausch

Antivirus Software

Foren Verzeichnis

HP Color Laserjet 1600

Windows 7 Forum


Social Bookmark Script

Visual Dataflex » VDF Anfänger » Erzeugen eines Arrays zur Laufzeit » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Erzeugen eines Arrays zur Laufzeit
Autor
Beitrag
Ditte Ditte ist männlich
Foren As


images/avatars/avatar-71.jpg

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 Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Ditte ist offline E-Mail an Ditte senden Homepage von Ditte Beiträge von Ditte suchen Nehmen Sie Ditte in Ihre Freundesliste auf
Matthias Matthias ist männlich
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 Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Matthias ist offline E-Mail an Matthias senden Homepage von Matthias Beiträge von Matthias suchen Nehmen Sie Matthias in Ihre Freundesliste auf
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 Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 abraxas ist offline E-Mail an abraxas senden Homepage von abraxas Beiträge von abraxas suchen Nehmen Sie abraxas in Ihre Freundesliste auf
Ditte Ditte ist männlich
Foren As


images/avatars/avatar-71.jpg

Dabei seit: 23.07.2007
Beiträge: 77
Einsatzart von VDF: gewerblich
Anwenderstatus: Programmierprofi
Herkunft: Berlin
Betriebssystem: XP,Win7,Win Serv2003,2008

Themenstarter Thema begonnen von Ditte
RE: Erzeugen eines Arrays zur Laufzeit Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Ditte ist offline E-Mail an Ditte senden Homepage von Ditte Beiträge von Ditte suchen Nehmen Sie Ditte in Ihre Freundesliste auf
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 Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 abraxas ist offline E-Mail an abraxas senden Homepage von abraxas Beiträge von abraxas suchen Nehmen Sie abraxas in Ihre Freundesliste auf
Ditte Ditte ist männlich
Foren As


images/avatars/avatar-71.jpg

Dabei seit: 23.07.2007
Beiträge: 77
Einsatzart von VDF: gewerblich
Anwenderstatus: Programmierprofi
Herkunft: Berlin
Betriebssystem: XP,Win7,Win Serv2003,2008

Themenstarter Thema begonnen von Ditte
RE: Erzeugen eines Arrays zur Laufzeit Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Ditte ist offline E-Mail an Ditte senden Homepage von Ditte Beiträge von Ditte suchen Nehmen Sie Ditte in Ihre Freundesliste auf
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 Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 abraxas ist offline E-Mail an abraxas senden Homepage von abraxas Beiträge von abraxas suchen Nehmen Sie abraxas in Ihre Freundesliste auf
Ditte Ditte ist männlich
Foren As


images/avatars/avatar-71.jpg

Dabei seit: 23.07.2007
Beiträge: 77
Einsatzart von VDF: gewerblich
Anwenderstatus: Programmierprofi
Herkunft: Berlin
Betriebssystem: XP,Win7,Win Serv2003,2008

Themenstarter Thema begonnen von Ditte
RE: Erzeugen eines Arrays zur Laufzeit Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Ditte ist offline E-Mail an Ditte senden Homepage von Ditte Beiträge von Ditte suchen Nehmen Sie Ditte in Ihre Freundesliste auf
Gehe zu:
Neues Thema erstellen Antwort erstellen
Visual Dataflex » VDF Anfänger » Erzeugen eines Arrays zur Laufzeit

Views heute: 2.827 | Views gestern: 2.645 | Views gesamt: 2.188.008

Impressum

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH | SEO by seo-wbb.de - Sponsored by Rene Urlaub und Reise Infos Frankenthal