 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 19.01.2008, 19:30 Titel: Problem mit UDT-Array |
|
|
Hallo,
ich habe ein Array von UDTs, deren Daten später per Locate UDT.PosX und UDT.PosY positioniert und dargestellt werden. Das sieht so aus:
Code: |
For ItemCounter = 1 To ItemNumbs
With Choices(ItemCounter)
.PosX = Choices(ItemCounter).ParentWindow->PosX + Len(LongestItem) + 3 + ItemCounter 'Hier wird die Ausgabe relativ zur Position eines Eltern-Fensters gesetzt.
.SignPosX = Choices(ItemCounter).PosX + 2 + Len(LongestItem)
'Choices(1).PosX = 60 'Dies klappt noch, die Ausgabe wird an der richtigen Stelle angezeigt.
End With
'Hiermit sollte eigentlich die PosX-Variable des UDT abgefragt werden, es wird aber für PosX 0 ausgegeben:
Print Choices(ItemCounter).Text; Choices(ItemCounter).SignPosX; Choices(ItemCounter).SignPosY
'Hiermit wird ein übergeordnetes Fenster an die Position des Rekords angepaßt. Das klappt unerklärlicherweise wieder (s. ChoiceWin).
If maxPosX < Choices(ItemCounter).PosX + 5 Then
maxPosX = Choices(ItemCounter).PosX + 5
EndIf
Next ItemCounter
With ChoiceWin
.LengthX = MaxPosX - ChoiceWin.PosX + 1
.LengthY = ItemNumbs + 2 + 3
End With
|
Das ganze findet in einer Funktion statt. Das Elternfenster wird ByRef übergeben, das UDT-Array "Choices(ItemNumbs) wird in der Funktion geDIMt.
Warum wird bei der Positionsabfrage 0 zurückgegeben, obwohl die Ausgabe an der richtigen Stelle erscheint und das Eltern-Fenster richtig erweitert wird? Das bedeutet ja, daß die PosX-Variable vorrübergehend ungültig wird, dann aber wieder gültig ist. Kann mit das jemand erklären? _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.01.2008, 20:06 Titel: |
|
|
Es wäre hilfreich, auch den Functions-Header zu sehen, und nicht nur deren inhalt. sowie die zeile, mit der du Callst
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 20.01.2008, 09:41 Titel: |
|
|
Es handelt sich um eine Auswahlbox, deren Wahlpunkte in einem String(ChoiceItems) übergeben wird. Der String wird durch SplitString in ein Array aufgeteilt, nach dem dann die UDTs für Auswahl erstellt werden.
Choices.SignPosX ist die Koordinate, an der der Auswahlschalter angezeigt wird (So ne Art Radio-Button wie in Windows). Er liegt zwei Zähler weiter rechts als Choices.PosX
Code: | Function StringChoiceBox(ByRef ChoiceWin As Win, ByRef ChoiceVariable As String, ChoiceItems As String, Buttons As String) As String
'***************** Auswahl initialisieren ********************************
Dim ItemNumbs As Integer
Dim ItemBuffer() As String
ItemNumbs = SplitString(ChoiceItems, ItemBuffer())
Dim Choices(ItemNumbs) As CheckButtons
Dim ItemCounter As Integer
Dim LongestItem As String
Dim maxPosX As Integer = ChoiceWin.PosX + Len(ChoiceWin.Title) + 2
'Hier beginnt die Initialisierung der Auswahlpunkte und des Fensters.
For ItemCounter = 1 To ItemNumbs
With Choices(ItemCounter)
.ParentWindow = @ChoiceWin
.Frame = Frame6
.Text = ItemBuffer(ItemCounter)
'.PosX siehe unten
.PosY = Choices(ItemCounter).ParentWindow->PosY + ItemCounter+1
.Sign = Mid(ButtonSetSigns, 2, 1) + Mid(ButtonErasedSigns, 3, 1)
'.SignPosX siehe unten
.SignPosY = Choices(ItemCounter).PosY
.LengthX = 1
.LengthY = Len(Choices(ItemCounter).Sign) + 1
.ForeColour = Choices(ItemCounter).ParentWindow->ForeColour
.BackColour = Choices(ItemCounter).ParentWindow->BackColour
.Filling = Mid(Fillings, 1, 1)
If .Text = ChoiceVariable Then
.State = set
Else
.state = erased
endif
End With
|
Nach Abfrage eines Menüs wird die Funktion aufgerufen:
Code: | Case "SingleChoice"
Dim ChoiceWin As Win
With ChoiceWin
.ParentWindow = @MainWindow
.WinStyle = "ChoiceBox"
.Title = "Lieblingsfarbe"
.PosX = ChoiceWin.ParentWindow->LengthX/2 - ChoiceWin.LengthX
.PosY = ChoiceWin.ParentWindow->LengthY/2 - ChoiceWin.LengthY/2
.Text = ""
.ForeColour = ChoiceWin.ParentWindow->BackColour
.BackColour = ChoiceWin.ParentWindow->ForeColour
.Frame = Frame2
.Filling = Mid(Fillings, 1, 1)
End With
Task = StringChoiceBox(ChoiceWin, Farbe, "Gelb Rot Blau Gruen", "Ok Abbrechen")
Print Farbe |
[Edit] Beim Herumprobieren mit Pointern treten verschiedene rätselhafte Fehler auf: Wenn ich ein Array mit Pointern auf den UDT erstelle, wird mir ein Teil der Daten nicht angezeigt- wohlgemerkt: nur einzelne Rekords eines Array-Elementes, die gleichen Rekords der anderen Elemente sind da.
Gibt es in FB die Möglichkeit, statt Pointern Referenzen zu erstellen (ich meinte nicht Parameterübergabe ByRef, sondern Referenzen innerhalb einer Funktion!). _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 21.01.2008, 13:52 Titel: |
|
|
Problem gelöst, danke  _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|