Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Problem mit UDT-Array

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 19.01.2008, 19:30    Titel: Problem mit UDT-Array Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 19.01.2008, 20:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 20.01.2008, 09:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 21.01.2008, 13:52    Titel: Antworten mit Zitat

Problem gelöst, danke zwinkern
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz