Xojo Developer Conference
25/27th April 2018 in Denver.
MBS Xojo Conference
6/7th September 2018 in Munich, Germany.

Re: Löschen einer Instanz eines Controls (Real Studio network user group Deutschland Mailinglist archive)

Back to the thread list
Previous thread: PopupMenu blockieren
Next thread: suche smal combobox


Probleme mit String Bearbeitung   -   Markus Schnell
  Re: Löschen einer Instanz eines Controls   -   MGE Lists
   Re: Löschen einer Instanz eines Controls   -   Karl Grob
    Löschen einer Instanz eines Controls   -   Karl Grob
     Re: Löschen einer Instanz eines Controls   -   Karl Grob
     Re: Löschen einer Instanz eines Controls   -   Karl Grob
     Re: Löschen einer Instanz eines Controls   -   Alex
     Re: Löschen einer Instanz eines Controls   -   Alex

Re: Löschen einer Instanz eines Controls
Date: 20.08.11 16:13 (Sat, 20 Aug 2011 15:13:45 +0000)
From: MGE Lists
//
for n As Integer = TabLinks.Ubound DownTo 0
TabLinks(n).Close // Jetzt sollte das Ram frei sein, ist PictureMBS spezifisch
TabLinks.Remove(n) // Nun ist der Eintrag im Array weg
next

-------- Original Message --------
Subject: Löschen einer Instanz eines Controls (20-Aug-2011 13:18)
From: Karl Grob <<email address removed>>
To: <email address removed>

> Hi,
>
> Vielleicht kann mir da jemand helfen (vielleicht bin ich auch zu blöde).Wie
> werde ich eine mit NEW erzeugte Instanz eines Controls wieder los?
>
> Beispiel:
>
> CBTabsLinks.DeleteAllRows
> while TabLinks(i) <> NIL
> if TabLinks(i).Visible then CBTabsLinks.AddRow format(
> getMassHorizontal(TabLinks(i).PixMass, Vergroesserung), "#.00")
> //if i > 0 then TabLinks(i) = NIL -> geht nicht!
> i = i+1
> wend
>
> CBTabsLinks ist eine Combobox
> TabLinks(i) sind Instanzen von ImageMBS, die mit NEW erzeugt wurden
> (Die Anzahl Tabulatoren ist ja zur Laufzeit verschieden).
>
> Es ist (nicht nur mit ImageMBS!) offensichtlich nicht möglich, eine solche
> Instanz mit NIL zu traktieren. Eine andere Möglichkeit sehe ich aber nicht.
> Ich hätte gerne eine 'saubere' Index-Abfolge, das geht aber nur, wenn ich
> auch dazwischen herauslöschen kann.
>
> Kennt jemand eine Lösung?
>
> Gruss
> Karl Grob
>
>
>

Re: Löschen einer Instanz eines Controls
Date: 21.08.11 10:26 (Sun, 21 Aug 2011 11:26:21 +0200)
From: Karl Grob
Besten Dank für den Hinweis.

Allerdings:
.Ubound und .Remove funktionieren für ImageMBS nicht, .close genügt.

Für RB-eigene Controls habe ich das noch nicht getestet.

Am 20.08.2011 um 17:13 schrieb MGE Lists:

> //
> for n As Integer = TabLinks.Ubound DownTo 0
> TabLinks(n).Close // Jetzt sollte das Ram frei sein, ist PictureMBS spezifisch
> TabLinks.Remove(n) // Nun ist der Eintrag im Array weg
> next
>
> -------- Original Message --------
> Subject: Löschen einer Instanz eines Controls (20-Aug-2011 13:18)
> From: Karl Grob <<email address removed>>
> To: <email address removed>
>
>> Hi,
>>
>> Vielleicht kann mir da jemand helfen (vielleicht bin ich auch zu blöde).Wie
>> werde ich eine mit NEW erzeugte Instanz eines Controls wieder los?
>>
>> Beispiel:
>>
>> CBTabsLinks.DeleteAllRows
>> while TabLinks(i) <> NIL
>> if TabLinks(i).Visible then CBTabsLinks.AddRow format(
>> getMassHorizontal(TabLinks(i).PixMass, Vergroesserung), "#.00")
>> //if i > 0 then TabLinks(i) = NIL -> geht nicht!
>> i = i+1
>> wend
>>
>> CBTabsLinks ist eine Combobox
>> TabLinks(i) sind Instanzen von ImageMBS, die mit NEW erzeugt wurden
>> (Die Anzahl Tabulatoren ist ja zur Laufzeit verschieden).
>>
>> Es ist (nicht nur mit ImageMBS!) offensichtlich nicht möglich, eine solche
>> Instanz mit NIL zu traktieren. Eine andere Möglichkeit sehe ich aber nicht.
>> Ich hätte gerne eine 'saubere' Index-Abfolge, das geht aber nur, wenn ich
>> auch dazwischen herauslöschen kann.
>>
>> Kennt jemand eine Lösung?
>>
>> Gruss
>> Karl Grob
>>
>>
>>
>
>
>
>

Löschen einer Instanz eines Controls
Date: 20.08.11 12:18 (Sat, 20 Aug 2011 13:18:06 +0200)
From: Karl Grob
Hi,

Vielleicht kann mir da jemand helfen (vielleicht bin ich auch zu blöde).

Wie werde ich eine mit NEW erzeugte Instanz eines Controls wieder los?

Beispiel:

CBTabsLinks.DeleteAllRows
while TabLinks(i) <> NIL
if TabLinks(i).Visible then CBTabsLinks.AddRow format(getMassHorizontal(TabLinks(i).PixMass, Vergroesserung), "#.00")
//if i > 0 then TabLinks(i) = NIL -> geht nicht!
i = i+1
wend

CBTabsLinks ist eine Combobox
TabLinks(i) sind Instanzen von ImageMBS, die mit NEW erzeugt wurden
(Die Anzahl Tabulatoren ist ja zur Laufzeit verschieden).

Es ist (nicht nur mit ImageMBS!) offensichtlich nicht möglich, eine solche Instanz mit NIL zu traktieren. Eine andere Möglichkeit sehe ich aber nicht. Ich hätte gerne eine 'saubere' Index-Abfolge, das geht aber nur, wenn ich auch dazwischen herauslöschen kann.

Kennt jemand eine Lösung?

Gruss
Karl Grob

Re: Löschen einer Instanz eines Controls
Date: 24.08.11 10:02 (Wed, 24 Aug 2011 11:02:22 +0200)
From: Karl Grob
Ich habe das doch noch einmal ausprobiert:

Es bleibt seltsam, aber funktioniert. Die Instanz lässt sich mit dem Befehl 'Close' beseitigen. Das Seltsame ist, dass das auch mit der 0-Instanz gemacht werden darf, und dass dennoch wieder neue Instanzen erzeugt werden können.
Der Test läuft so: Ein leeres Window, ein TextField mit Namen 'TF_Text' mit Index 0 und 2 PushButtons ('Lösch' und 'MachNeu') und einen Zaehler, der mitgeführt wird. Es handelt sich definitiv nicht um einen normalen ARRAY (redim, ubound etc. funktionieren nicht). Der Zähler hat den Anfangswert -1.

Seltsam ist diese Methode, weil nach dem 'Close' der Null-Instanz das 'TF_Text' im Debugger nicht mehr vorhanden ist, der NEW Befehl aber dennoch funktioniert. Das 'open' verlangt aber zwingend eine 0-Instanz von TF_Text.

Ich füge das Beispiel an, weil ich in keiner Doku eine Erklärung erhalten habe. Hinterher findet man den 'close'-Befehl für Controls schon, aber ein Zusammenhang z. B. mit 'NEW' wird nicht hergestellt.

------------

Window1.Open:

zaehler As Integer = -1

Sub Open()
dim tf as TextField
Zaehler = 0
TF_Test(0).Text = "Index = " + str(0)

for i as Integer = 1 to 20
zaehler = zaehler + 1
tf = new TF_Test
tf.Text = "Index = " + str(i)
tf.Left = TF_Test(i-1).Left + 10
tf.Top = TF_Test(i-1).Top + 10
next

End Sub

Window1 Control PushButton1: // 'Lösch einen'

Sub Action()
if TF_Test(zaehler) <> NIL then
TF_Test(zaehler).Close
zaehler = zaehler - 1
end if

End Sub

Window1 Control PushButton2: // 'Mach neues'

Sub Action()
dim tf as TextField
zaehler = zaehler + 1
tf = new TF_Test
tf.Text = "Index = " + str(tf.Index)
if zaehler = 0 then
tf.Left = 20
tf.Top = 20
else
tf.Left = TF_Test(tf.Index-1).Left + 10
tf.Top = TF_Test(tf.Index-1).Top + 10
end if

End Sub


Am 24.08.2011 um 08:27 schrieb Karl Grob:

> Im Moment kann ich das allgemein aus Zeitgründen nicht kontrollieren. Mit ImageMBS funktioniert es. (Es geht um eine mit der Maus editierbare Tabulatorenleiste ähnlich wie z. B. in Indesign.
> Generell ist das Problem nicht sehr dramatisch, aber einfach irgendwie unerklärlich. (Schon Matt Neuburg hat in seinem Buch diese Art der Instanzbildung kritisiert.)
> Eine 'dreckige' Lösung dürfte in jedem Fall der Wechsel von 'visible' true/false sein, aber damit produziert man jede Menge unnötige Instanzen, die man zur Laufzeit nicht mehr los wird. Soweit ich bisher verstanden habe, muss ich eben die Instanz mit dem 0-Index immer am Leben erhalten (über sie läuft ja der NEW Befehl), es handelt sich eben gar nicht um echte ARRAYs (das glaubt nur die IDE von RealStudio, aber nicht der Compiler). Aber ich werde das nochmals überprüfen. Jedenfalls Danke.
>
> Am 23.08.2011 um 23:56 schrieb Alex:
>
>>>>
>>>> Es ist (nicht nur mit ImageMBS!) offensichtlich nicht möglich, eine solche Instanz mit NIL zu traktieren. Eine andere Möglichkeit sehe ich aber nicht. Ich hätte gerne eine 'saubere' Index-Abfolge, das geht aber nur, wenn ich auch dazwischen herauslöschen kann.
>>>
>>>
>>> TabLinks(i).remove?
>>
>>
>> Ah entschuldige, hatte nicht gesehen, dass jemand diese Antwort schon vorgeschlagen hat (Mail in Lion zerreisst mir die Mailthreads immer, komisch).
>>
>> Ansonsten hätte ich gesagt, neues Array erstellen und die Werte, die du behalten möchtest, übernehmen. Und wenn ubound nicht will, selber mitzählen.
>>
>
>
>

Re: Löschen einer Instanz eines Controls
Date: 24.08.11 07:27 (Wed, 24 Aug 2011 08:27:02 +0200)
From: Karl Grob
Im Moment kann ich das allgemein aus Zeitgründen nicht kontrollieren. Mit ImageMBS funktioniert es. (Es geht um eine mit der Maus editierbare Tabulatorenleiste ähnlich wie z. B. in Indesign.
Generell ist das Problem nicht sehr dramatisch, aber einfach irgendwie unerklärlich. (Schon Matt Neuburg hat in seinem Buch diese Art der Instanzbildung kritisiert.)
Eine 'dreckige' Lösung dürfte in jedem Fall der Wechsel von 'visible' true/false sein, aber damit produziert man jede Menge unnötige Instanzen, die man zur Laufzeit nicht mehr los wird. Soweit ich bisher verstanden habe, muss ich eben die Instanz mit dem 0-Index immer am Leben erhalten (über sie läuft ja der NEW Befehl), es handelt sich eben gar nicht um echte ARRAYs (das glaubt nur die IDE von RealStudio, aber nicht der Compiler). Aber ich werde das nochmals überprüfen. Jedenfalls Danke.

Am 23.08.2011 um 23:56 schrieb Alex:

>>>
>>> Es ist (nicht nur mit ImageMBS!) offensichtlich nicht möglich, eine solche Instanz mit NIL zu traktieren. Eine andere Möglichkeit sehe ich aber nicht. Ich hätte gerne eine 'saubere' Index-Abfolge, das geht aber nur, wenn ich auch dazwischen herauslöschen kann.
>>
>>
>> TabLinks(i).remove?
>
>
> Ah entschuldige, hatte nicht gesehen, dass jemand diese Antwort schon vorgeschlagen hat (Mail in Lion zerreisst mir die Mailthreads immer, komisch).
>
> Ansonsten hätte ich gesagt, neues Array erstellen und die Werte, die du behalten möchtest, übernehmen. Und wenn ubound nicht will, selber mitzählen.
>

Re: Löschen einer Instanz eines Controls
Date: 23.08.11 22:56 (Tue, 23 Aug 2011 23:56:17 +0200)
From: Alex
>>
>> Es ist (nicht nur mit ImageMBS!) offensichtlich nicht möglich, eine solche Instanz mit NIL zu traktieren. Eine andere Möglichkeit sehe ich aber nicht. Ich hätte gerne eine 'saubere' Index-Abfolge, das geht aber nur, wenn ich auch dazwischen herauslöschen kann.
>
>
> TabLinks(i).remove?

Ah entschuldige, hatte nicht gesehen, dass jemand diese Antwort schon vorgeschlagen hat (Mail in Lion zerreisst mir die Mailthreads immer, komisch).

Ansonsten hätte ich gesagt, neues Array erstellen und die Werte, die du behalten möchtest, übernehmen. Und wenn ubound nicht will, selber mitzählen.

Re: Löschen einer Instanz eines Controls
Date: 23.08.11 22:45 (Tue, 23 Aug 2011 23:45:16 +0200)
From: Alex


> CBTabsLinks.DeleteAllRows
> while TabLinks(i) <> NIL
> if TabLinks(i).Visible then CBTabsLinks.AddRow format(getMassHorizontal(TabLinks(i).PixMass, Vergroesserung), "#.00")
> //if i > 0 then TabLinks(i) = NIL -> geht nicht!
> i = i+1
> wend
>
> CBTabsLinks ist eine Combobox
> TabLinks(i) sind Instanzen von ImageMBS, die mit NEW erzeugt wurden
> (Die Anzahl Tabulatoren ist ja zur Laufzeit verschieden).
>
> Es ist (nicht nur mit ImageMBS!) offensichtlich nicht möglich, eine solche Instanz mit NIL zu traktieren. Eine andere Möglichkeit sehe ich aber nicht. Ich hätte gerne eine 'saubere' Index-Abfolge, das geht aber nur, wenn ich auch dazwischen herauslöschen kann.

TabLinks(i).remove?

Gruss,
Alex