Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Doppelte Buchseiten aus einer Liste darstellen (https://www.delphipraxis.net/91408-doppelte-buchseiten-aus-einer-liste-darstellen.html)

Luckie 4. Mai 2007 13:09


Doppelte Buchseiten aus einer Liste darstellen
 
Ich habe eine Liste mit Buchseite:
Code:
Page0
Page1
Page2
Page3
Page4
PageN
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:
Code:
Seite 1
Seiten 2 - 3
Seiten 4 - 5
Seiten 6 - 7
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.

Bisher versuche ich es so:
Delphi-Quellcode:
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;
Dies hat aber zur Folge, dass es nicht richtig funktioniert. Wenn ich folgende Liste habe:
Code:
Seite 1
Seite 2 - 3
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:

marabu 4. Mai 2007 13:23

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:
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;
Vielleicht ist der Fehler dann auch schon weg...

Freundliche Grüße

Luckie 4. Mai 2007 13:28

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:
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;
Bis auf wenn die erste Seite erzeugt wird, dann bekomme ich ein List index out of bounds(-1). :wall:
Ich habe gleich ein Knoten im Hirn!

marabu 4. Mai 2007 19:02

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

Luckie 4. Mai 2007 19:50

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 12:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz