2009-08-22 14 views
2

Ich benutze ein TPageControl mit den Registerkarten der TTabsheets, die so versteckt sind, dass die enthaltenen Frames scheinbar gestapelt sind, und erstelle eine Art Assistenten, indem ein anderer Frame in verschiedenen Schritten im Prozess angezeigt wird.Wie überprüfe ich die vorherige Registerkarte, wenn ich in einer Seitensteuerung von Seite zu Seite gehe?

Problem ist, nach dem Aufruf von "PageControl1.ActivePageIndex: = x;" Um den nächsten Rahmen anzuzeigen, muss ich einmal in dem neuen Rahmen wissen, wie ich hierher gekommen bin, d. h. welcher Rahmen zuvor angezeigt wurde.

Wenn ein anderer Benutzer Frames in einer Seitensteuerung verwendet hat, um einen Assistenten zu erstellen, wie behalten Sie den Überblick über vorherige/nächste Frames?

Vielen Dank.

+0

Können Sie den Wert des vorherigen Seitenindexes nicht in einem Feld speichern? – idursun

+0

Diese Frage hat wirklich nichts mit Frames zu tun. Sie sind nur die Komponenten, die Sie auf den Tabs haben. Was Sie fragen, ist die Seitensteuerung und die Aufzeichnung, welche Registerkarte zuvor nach einem Seitenwechsel aktiv war. Das wechselnde Ereignis ist was du willst. – Argalatyr

+0

Titel und Text bearbeitet, um meinen vorherigen Kommentar zu reflektieren – Argalatyr

Antwort

5

TPageControl verfügt über ein Ereignis namens OnChanging, das vor der Änderung aufgerufen wird, und Sie können die Änderung abbrechen, indem Sie einen Parameter auf false setzen.

Sie können dieses Ereignis auch verwenden, um aufzuzeichnen, welche Seite vor der Änderung aktiv war.

Ich würde Sie ermutigen, etwas zu machen, das nicht so stark an eine GUI-Komponente gekoppelt ist, obwohl. Versuchen Sie, irgendeine Art von Klasse dafür zu veranlassen, Rahmen zu halten und zu prüfen, ob der Wechsel von einem zum anderen erlaubt sein sollte und so weiter. Dies würde es einfacher machen, zu wechseln, welche Art von GUI-Steuerelement Sie verwenden würden, um den Assistenten zu visualisieren. Und es würde sicherlich viel einfacher zu testen, um zu sehen, ob Ihr Assistent Schritt für Schritt Progression, die Sie möchten, wenn Validierungsregeln erzwungen wird und so weiter gibt.

+0

Wenn Sie die TabVisible-Eigenschaft für eine Seite auf false setzen, wird das OnChanging-Ereignis nicht aufgerufen (da es sich auf die * Registerkarten * bezieht und nicht auf die * Seiten * – Nat

+0

@Nat, gilt Ihr Kommentar nur für bestimmte Methoden zum Ändern der activepage.Onchange _does_ fire, auch mit tabvisible = false, wie in meiner Antwort auf diese Frage dargestellt .. – Argalatyr

1

Auf delphi.about.com ist ein article, wie Sie eine Assistenten-ähnliche Benutzeroberfläche erstellen. Sie können die TPageControl.SelectNextPage-Methode verwenden, um eine Reihe von Seiten vor- und zurückzublättern.

0

Sie können auch die Wizard-Komponente anzeigen, die Teil der JEDI VCL-Bibliothek ist.

0

Ich habe eine wizard framework geschrieben, die fast das tut, was Sie versuchen zu tun. Das meiste davon ist auf meiner blog dokumentiert. Die Lösung, die ich verwendete, war, die Anfrage für eine nächste/vorherige Seite an den Rahmen selbst (unter Verwendung von Schnittstellen) zu übertragen und den Rahmen entscheiden zu lassen, was der nächste Rahmen sein sollte.

Wenn Sie die beiden Ideen zusammenführen möchten (indem Sie Ihr tPageControl beibehalten), können Sie die Anforderung einfach an tPageControl.ActivePage weiterleiten und für die Implementierung von NavigateToPage nach den von Ihnen benannten Seiten suchen und nicht versuchen um eine bestimmte Klasse zu finden.

Das Design meines Assistenten-Frameworks bestand darin, einige komplexe Assistenten zu behandeln, die auf der Grundlage von Entscheidungen mehrere Pfade enthielten. Ich habe die vorherigen Frames in einer Liste gespeichert und der "Status" jedes Frames wurde in einer global zugänglichen Klasse gespeichert, die gelöscht wurde, sobald der Assistent beendet/abgebrochen wurde.

0

Sie müssen den vorherigen Seitenindex manuell nachverfolgen. Zum Beispiel in Ihrem Next und OnClick Ereignishandler der Schaltfläche Zurück, könnten Sie so etwas tun:

procedure TWizardForm.NextClick(ASender: TObject); 
begin 
    SwitchPage(True); 
end; 

procedure TWizardForm.PreviousClick(ASender: TObject); 
begin 
    SwitchPage(False); 
end; 

SwitchPage() wie folgt aussehen würde:

procedure TWizardForm.SwitchPage(AForward: boolean); 
var 
    LGotoPage: integer; 
begin 
    LGotoPage := PageControl.ActivePageIndex; 

    if AForward and (PageControl.ActivePageIndex < PageControl.PageCount) then 
    inc(LGotoPage) 
    else if PageControl.PageIndex > 0 then 
    dec(LGotoPage); 

    if (LGotoPage <> PageControl.ActivePageIndex) 
    and AllowSwitchFrom(ActivePageIndex) then 
    begin 
    FPreviousPage := PageControl.ActivePageIndex; 
    PageControl.ActivePageIndex := LGotoPage; 
    end; 

end; 

Oder etwas in diesem Sinne.:)

Bearbeiten: Argalatyr ist richtig, und ich bin falsch, in dem Fall, wo Sie durch den Assistenten in der Reihenfolge durchlaufen möchten, die ich hier annehmen werde, ist der Fall hier.

Der OnChanging-Handler wird tatsächlich ausgelöst, und die Seite, von der Sie kommen, ist (noch) die aktive Seite.

Das OnChanging-Ereignis wird nicht ausgelöst, wenn Sie den Seitenindex direkt einstellen, wie in meinem Beispiel, so dass Sie den alten Seitenindex im Auge behalten müssen. Dies kommt von der Programmierung von Assistenten mit optionalen Seiten (nicht sequenziell).

Ich sollte etwas besser überprüft haben, bevor ich gepostet habe. Anwendungen für die falsche Antwort.

N @

+0

Dies ist nicht notwendig, siehe meine Antwort – Argalatyr

1

Im Gegensatz Antwort auf Nats, die tpagecontrol.onchanging Veranstaltung wird gut funktionieren, wenn Sie die richtigen Methoden verwenden, um Seiten zu ändern:

Erstellen einer VCL-Formularanwendung und fallen auf einem TPageControl, Set Align Eigentum zu alTop und lassen etwas Raum unten. Klicken Sie mit der rechten Maustaste auf das PageControl und fügen Sie einige Seiten hinzu, wobei Sie jeweils TabVisible:=false einstellen. Fügen Sie jetzt ein paar Buttons hinzu. Bringen Sie die onchanging Veranstaltung Pagecontrol und die onclick Ereignisse Buttons, um an den jeweiligen Code unten:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if PageControl1.ActivePageIndex < PageControl1.PageCount - 1 then 
    PageControl1.SelectNextPage(true, false); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    if PageControl1.ActivePageIndex > 0 then 
    PageControl1.SelectNextPage(false, false); 
end; 

procedure TForm1.PageControl1Changing(Sender: TObject; 
    var AllowChange: Boolean); 
begin 
    showmessage(format('now leaving page number %d', [PageControl1.ActivePageIndex])); 
end; 

Dies funktioniert wie erwartet (BDS2006, RAD2009).

+0

Offensichtlich können Sie Hook und verwenden Sie das OnChange-Ereignis auf die gleiche Weise. – Argalatyr

Verwandte Themen