![]() |
Doppelte Buchseiten aus einer Liste darstellen
Ich habe eine Liste mit Buchseite:
Code:
Diese sollen jetzt als Doppelseiten dargestellt werden. Problem ist, dass die erste Seite (Page0) keine linke Seite hat, wie das nun mal bei einem Buch so ist. In einer Listbox steht es entsprechend drinne:
Page0
Page1 Page2 Page3 Page4 PageN
Code:
Das heißt, klicke ich auf den ersten Eintrag, soll nur die rechte Seite dargestellt werden. Der Methode übergebe ich immer den Index der linken Seiten. Die rechte Seite ist dann immer IndexLinkeSeite + 1.
Seite 1
Seiten 2 - 3 Seiten 4 - 5 Seiten 6 - 7 Bisher versuche ich es so:
Delphi-Quellcode:
Dies hat aber zur Folge, dass es nicht richtig funktioniert. Wenn ich folgende Liste habe:
procedure TFotoBook.DisplayDoublePage(PageIndex: Integer);
begin if (PageIndex <> 0) and (PageIndex <> -1) then // Seite ist nicht erste Seite, also anzeigen begin if Assigned(LeftPage) then LeftPage.Visible := False; LeftPage := FPageCollection.Items[PageIndex]; LeftPage.Left := PageParent.Width div 2 - LeftPage.Width - PAGEGAP div 2; LeftPage.Top := PageParent.Height div 2 - LeftPage.Height div 2; LeftPage.Visible := True; end; if Assigned(RightPage) then RightPage.Visible := False; if PageIndex = -1 then PageIndex := 0 else PageIndex := PageIndex + 1; RightPage := FPageCollection.Items[PageIndex]; RightPage.Left := PageParent.Width div 2 + PAGEGAP div 2; RightPage.Top := PageParent.Height div 2 - RightPage.Height div 2; RightPage.Visible := True; end;
Code:
Und ich wähle den zweiten Eintrag aus, zeigt er mir nur eine Seite an. Erst wenn ich zum zweitenmal auf den Eintrag klicke, zeigt er mir beide an. Wo ist da mein Denkfehler? Irgendwie hab eich auch das Gefühl, als wenn ich zu kompliziert denke. :gruebel:
Seite 1
Seite 2 - 3 |
Re: Doppelte Buchseiten aus einer Liste darstellen
Hallo Michael,
wenn ich deinen Code richtig interpretiere, dann würde ich ihn eher so schreiben:
Delphi-Quellcode:
Vielleicht ist der Fehler dann auch schon weg...
procedure TForm1.DisplayDoublePage(PageIndex: Integer);
begin if Assigned(LeftPage) then LeftPage.Visible := False; if PageIndex < 0 then LeftPage := nil else LeftPage := FPageCollection.Items[PageIndex]; if Assigned(LeftPage) then begin LeftPage.Left := PageParent.Width div 2 - LeftPage.Width - PAGEGAP div 2; LeftPage.Top := PageParent.Height div 2 - LeftPage.Height div 2; LeftPage.Visible := True; end; Inc(PageIndex); if Assigned(RightPage) then RightPage.Visible := False; if PageIndex < FPageCollection.Count then RightPage := FPageCollection.Items[PageIndex] else RightPage := nil; if Assigned(RightPage) then begin RightPage.Left := PageParent.Width div 2 + PAGEGAP div 2; RightPage.Top := PageParent.Height div 2 - RightPage.Height div 2; RightPage.Visible := True; end; end; Freundliche Grüße |
Re: Doppelte Buchseiten aus einer Liste darstellen
Danke für deine Mühe, aber das hat leider keine Auswirkungen auf das Verhalten.
Ich habe festgestellt, dass wenn Seite eins angezeigt wird und ich auf die Seiten 2 - 3 klicke, der Code zwar ausgeführt wird für die Linke Seite, aber sie nicht angezeigt wird. :gruebel: So funktioniert es:
Delphi-Quellcode:
Bis auf wenn die erste Seite erzeugt wird, dann bekomme ich ein List index out of bounds(-1). :wall:
procedure TFotoBook.DisplayDoublePage(PageIndex: Integer);
begin if (not Odd(PageIndex)) and (PageIndex <> 0) then Inc(PageIndex); // Alles unsichtbar machen, sonst funktio0niert Update nicht if Assigned(LeftPage) then LeftPage.Visible := False; if Assigned(RightPage) then RightPage.Visible := False; if (PageIndex = 0) or (PageIndex = -1) then LeftPage := nil else begin LeftPage := FPageCollection.Items[PageIndex]; LeftPage.Visible := False; end; if Assigned(LeftPage) then begin ShowMessage('Linke Seite anzeigen'); LeftPage.Left := PageParent.Width div 2 - LeftPage.Width - PAGEGAP div 2; LeftPage.Top := PageParent.Height div 2 - LeftPage.Height div 2; LeftPage.Visible := True; end; if (PageIndex > 0) and not (FpageCollection.Count < 0) then Inc(PageIndex); if PageIndex < FPageCollection.Count then begin //if (PageIndex > 0) and not (FpageCollection.Count < 0) then // Inc(PageIndex); RightPage := FPageCollection.Items[PageIndex]; end else RightPage := nil; if Assigned(RightPage) then begin RightPage.Visible := False; ShowMessage('Rechte Seite anzeigen'); RightPage.Left := PageParent.Width div 2 + PAGEGAP div 2; RightPage.Top := PageParent.Height div 2 - RightPage.Height div 2; RightPage.Visible := True; end; end; Ich habe gleich ein Knoten im Hirn! |
Re: Doppelte Buchseiten aus einer Liste darstellen
Hallo Michael,
folgende Fragen halte ich für zielführend: Welchen Wertebereich hat der Parameter PageIndex? Ich ging davon aus, dass der Wertebereich [-1 .. FPageCollection.Count-2] ist. Welchen Typ haben LeftPage und RightPage bzw. die Items der FPageCollection? Daraus ergibt sich dann für mich, ob eine einfache Zuweisung oder ein Assign() notwendig ist. Unabhängig davon kann ich meine Code-Zeilen durch eine zusätzliche Zähl-Schleife nochmal halbieren, da mein Code eigentlich redundant ist. Die Dimensionierung der beiden Anzeigeelemente kann man bestimmt auch an einer anderen Stelle sinnvoller erledigen, oder? Freundliche Grüße |
Re: Doppelte Buchseiten aus einer Liste darstellen
Ich habe es jetzt hinbekommen. Ich poste am Montag den Code. Aber zu deinen Fragen: LeftPage und RightPage sind sowas wie Images. Der Wertebereich geht von 0 bis FPageCollection.Count - 1. Da ich mich irgendwann mal entshieden habe immer den Index der linkn Seite anzugeben, um zu bestimmen, welches Seitenpaar angezeigt werden soll und die erste Seite ja keine linke Seite hat, kann es schon passieren, dass -1 übergeben wird.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz