AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Das geheimnissvolle Controll

Ein Thema von Delbor · begonnen am 13. Nov 2018 · letzter Beitrag vom 14. Nov 2018
Antwort Antwort
Seite 2 von 2     12   
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#11

AW: Das geheimnissvolle Controll

  Alt 13. Nov 2018, 20:11
ungetestet sowas in der Art?
Delphi-Quellcode:
procedure TRSPdfFrame.PdfViewCreate;
  var i: integer;
  myCompo : TComponent;
begin
  for i := 0 to 4 do
  begin
    myCompo := ScrollBox1.FindComponent('PdfView'+intToStr(i));
    if not Assigned(myCompo) then
    begin
      FPDFView := TPdfView.Create(Self);
      FPdfView.Parent := Scrollbox1;
      FPdfView.Name := 'PdfView'+intToStr(i);
      FPdfView.Color := clyellow;
    end
    else
    begin
      FPdfView := TPdfView(myCompo);
    end;
    FPdfView.Height := 120;
    FPdfView.Top := i * (FPdfView.Height + 8);
    FPdfView.Width := Scrollbox1.ClientWidth - 40;
    FPdfView.Left := (ScrollBox1.ClientWidth - FPdfView.Width) div 2;
    ScrollBox1.VertScrollBar.Range := ScrollBox1.VertScrollBar.Range + FPdfView.Height;
  end;
end;
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Das geheimnissvolle Controll

  Alt 14. Nov 2018, 13:40
Hi Delphi.Narium

Vielen Dank für dein Beispiel! Ich hab das allerdings etwas anders umgesetzt. Auf der Mainform hab ich einen Buton platziert:
Delphi-Quellcode:
procedure THomeOfficerMainForm.BitBtn1Click(Sender: TObject);
begin
  RSPdfContentFrame1.RSPdfFrame1.PdfViewCreate;
  Edit1.Text := 'Es wurden ' + IntToStr(Self.RSPdfContentFrame1.RSPdfFrame1.PdfList.Count);
end;
Auslöser ist schlussendlich das Öffnen eines PDFs, dessen Seiten jeweilsden Controls zugewiesen werden - für den Test geügt mir vorerst aber der Aufruf von PdfViewCreate. Da gehts dann so weiter:
Delphi-Quellcode:
procedure TRSPdfFrame.PdfViewCreate;
  var i: integer;
begin
  if FPdfList.Count = 0 then
  begin
    for i := 0 to 4 do
    begin
      FPDFView := TPdfView.Create(Self);
      FPdfView.Parent := Scrollbox1;
      FPdfView.Name := 'PdfView'+intToStr(i);
      FPdfView.Color := clyellow;
      FPdfView.Height := 120;
      FPdfView.Top := i * (FPdfView.Height + 8);
      FPdfView.Width := Scrollbox1.ClientWidth - 40;
      FPdfView.Left := (ScrollBox1.ClientWidth - FPdfView.Width) div 2;
      ScrollBox1.VertScrollBar.Range := ScrollBox1.VertScrollBar.Range + FPdfView.Height;
      FPdfList.Add(FPdfView);
     end;
  end
  else
    Showmessage('Die Seiten sind bereits vorhanden');
end;
FPdfList ist eine generische Objectliste. die - zumindest hier - bei Programmstart erzeugt und bei Ende zerstört wird. Interessant ist: Laut Help ist das Property OwnsObject dieser Liste per Voreinstellung True. Bevor ich das allerdings explizit zugewiesen hatte, erhielt ich immer bei Programmende eine Meldung. Die war zwar so schnell wieder weg, dass ich sie gar nicht lesen konnte.
Nach der Zuweisung war die Fehlermeldung weg...

Seltsam ist allerdings, dass nun die beiden letzten Controls weniger breit gezeichnet werden als die ersten drei. Im Anhang zeigt ein jpeg, wies zur Zeit aussieht.

Links von der Scrollbox mit den Controls befindet sich ein Splitter und eine weitere Scrollbox. Diese soll alle Seiten (teilweise im nichtsichtbaren Bereich) in Thumbnailgrösse entalten - standardmässig untereinander. Doch durch bewegen des Splitters soll diese Scrollbox die Thumbnails auch nebeneinander anzeigen können. Eine Herausforderung dürfte aber das Entwicklen eines entsprechenden Algorrytmus sein. Über Denkanstösse dazu würde ich mich freuen!


Gruss
Delbor
Miniaturansicht angehängter Grafiken
13_11_19-window.jpg  
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#13

AW: Das geheimnissvolle Controll

  Alt 14. Nov 2018, 14:31
Seltsam ist an der unterschiedlichen Breite garnichts.

Bis zum 3. Control wird keine Scrollbar benötigt, ab dem 4. aber schon, damit ändern sich automatisch ein paar Werte, die bei der Breitenberechnung berücksichtigt werden.

Einfachste Methode zur Lösung: Scrollbar immer anzeigen, auch wenn sie nicht benötigt wird, dann ändert sich der Wert von Scrollbox1.ClientWidth auch nicht und bei der Berechnung kommt immer der gleiche Wert raus.

Oder eventuell:
Delphi-Quellcode:
procedure TRSPdfFrame.PdfViewCreate;
  var
  i : integer;
  iCount : Integer;
  iLeft : Integer;
  iHeight : Integer;
  iTop : Integer;
  iWidth : Integer;
begin
  if FPdfList.Count = 0 then
  begin
    iCount := 5; // Statt 0 bis 4 - 1 bis 5, damit kann man später besser weiterrechnen.
    iLeft := (ScrollBox1.ClientWidth - iWidth) div 2;
    iHeight := 120;
    iTop := iHeight + 8;
    iWidth := Scrollbox1.ClientWidth - 40;
    for i := 1 to iCount do
    begin
      FPDFView := TPdfView.Create(Self);
      FPdfView.Parent := Scrollbox1;
      FPdfView.Name := Format('PdfView%d',[i]);
      FPdfView.Color := clyellow;
      FPdfView.Height := iHeigth;
      FPdfView.Top := i * iTop;
      FPdfView.Width := iWidth;
      FPdfView.Left := iLeft;
      FPdfList.Add(FPdfView);
     end;
     ScrollBox1.VertScrollBar.Range := iCount * iHeight;
  end
  else
    Showmessage('Die Seiten sind bereits vorhanden');
end;
Und wenn man die hier im Quelltext zugewiesenen "Konstanten" als Parameter in den Aufruf von Create "verschiebt", kann man, ohne die Methode nochmal anfassen zu müssen, die Zahl der FPdfView in der Scrollbox variieren, deren Breite, Höhe und ggfls. deren "Oberkante" (Top) verändern ... Dies könnte man aber auch als Attribute der Klasse TRSPdfFrame realisieren.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Das geheimnissvolle Controll

  Alt 14. Nov 2018, 14:52
Übersehe ich etwas, oder könnte man nicht auch einfach jeweils Align auf alTop setzen, dann spart man sich die ganze Rechnerei?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#15

AW: Das geheimnissvolle Controll

  Alt 14. Nov 2018, 15:10
Dann hat man aber keine 8 Pixel Abstand zwischen den einzelnen TPdfView
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
668 Beiträge
 
Delphi 12 Athens
 
#16

AW: Das geheimnissvolle Controll

  Alt 14. Nov 2018, 15:25
Dann hat man aber keine 8 Pixel Abstand zwischen den einzelnen TPdfView
Dann setzt man halt AlignWithMargins auf true und Margins.Top auf 8
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#17

AW: Das geheimnissvolle Controll

  Alt 14. Nov 2018, 15:28
Oder man rechnet bei der Breitenberechnung die Breite der Scollbar immer mit ein, auch wenn sie nicht angezeigt wird. Dann hätte man zwar einen breiteren rechten Rand, wenn die Scrollbar nicht angezeigt wird, aber es passt dann auch wenn sie angezeigt wird. Und alle PDFView's wären gleiche breit.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Das geheimnissvolle Controll

  Alt 14. Nov 2018, 19:35
Hi zusammen

Ich hab nun Delphi.Nariums Vorschlag mal umgesetzt. Allerdings habe ich lange nach einer Möglichkeit gesucht, die VertScrollbars standartmässig anzuzeigen - das hier hat mir dann wohl geholfen (Beitrag 3):
Delphi-Quellcode:
procedure TRSPdfFrame.PdfViewCreate;
  var i, iCount, iLeft, iHeight,
      iTop, iWidth : Integer;
begin
  if FPdfList.Count = 0 then
  begin
    iCount := 5; // Statt 0 bis 4 - 1 bis 5, damit kann man später besser weiterrechnen.
    iLeft := (ScrollBox1.ClientWidth - iWidth) div 2;
    iHeight := 120;
    iTop := iHeight + 8; // Sehe allerdings gerade, dass dies falsch ist; danach ist das erste Top 128 statt 8
    iWidth := Scrollbox1.ClientWidth - 40;
    Scrollbox1.AutoScroll := False;
    Scrollbox1.VertScrollBar.Range := iTop * ICount;
    for i := 1 to 5 do
    begin
      FPDFView := TPdfView.Create(Self);
      FPdfView.Parent := Scrollbox1;
      FPdfView.Name := 'PdfView'+intToStr(i);
      FPdfView.Color := clyellow;

      FPdfView.Height := iHeight;
      FPdfView.Top := (i-1) * iTop;
      FPdfView.Width := iWidth;
      FPdfView.Left := iLeft;
      FPdfView.Visible := true;
// ScrollBox1.VertScrollBar.Range := ScrollBox1.VertScrollBar.Range + FPdfView.Height;
      FPdfList.Add(FPdfView);
     end;
  end
  else
    Showmessage('Die Seiten sind bereits vorhanden');
end;
Leider wird mir keines der FPdfView angezeigt.

Der Vorschlag, mit den Margins zu arbeiten, gefällt mir irgendwie doch recht gut - sollen 2 oder mehrere Controls nebeneinander stehen, ist der notwendige Algorhytmus wohl sehr viel einfacher und übersichtlicher.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Das geheimnissvolle Controll

  Alt 14. Nov 2018, 20:13
Hi zusammen

Nachdem ich die Wertzuweisungen an Left & Co wieder zurückgestellt habe (inkusive des Bereichs 0 bis 4) sieht das ganze so aus:
20_54_50-window.jpg
Delphi-Quellcode:
procedure TRSPdfFrame.PdfViewCreate;
  var i, iCount, iLeft, iHeight,
      iTop, iWidth : Integer;
begin
  if FPdfList.Count = 0 then
  begin
    iCount := 5; // Statt 0 bis 4 - 1 bis 5, damit kann man später besser weiterrechnen.
    iLeft := (ScrollBox1.ClientWidth - iWidth) div 2;
    iHeight := 120;
    iTop := iHeight + 8;
    iWidth := Scrollbox1.ClientWidth - 40;
    Scrollbox1.AutoScroll := False;
    Scrollbox1.VertScrollBar.Range := iTop * ICount;
    for i := 0 to 4 do
    begin
      FPDFView := TPdfView.Create(Self);
      FPdfView.Parent := Scrollbox1;
      FPdfView.Name := 'PdfView'+intToStr(i);
      FPdfView.Color := clyellow;

      FPdfView.Height := 120; //iHeight;
      FPdfView.Top := i * (FPdfView.Height + 8);
      FPdfView.Width := Scrollbox1.ClientWidth - 40;
      FPdfView.Left := (ScrollBox1.ClientWidth - FPdfView.Width) div 2;;
      FPdfView.Visible := true;
      FPdfList.Add(FPdfView);
     end;
  end
  else
    Showmessage('Die Seiten sind bereits vorhanden');
end;
Wieso mir allerdings unter Verwendung der i-Variablen nichts angrzeigt wirde, ist mir Schleierhaft...

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Das geheimnissvolle Controll

  Alt 14. Nov 2018, 20:20
Hi zusammen

Nachdem ich die Wertzuweisungen an Left & Co wieder zurückgestellt habe (inkusive des Bereichs 0 bis 4) sieht das ganze so aus:
Anhang 50249
Delphi-Quellcode:
procedure TRSPdfFrame.PdfViewCreate;
  var i, iCount, iLeft, iHeight,
      iTop, iWidth : Integer;
begin
  if FPdfList.Count = 0 then
  begin
    iCount := 5; // Statt 0 bis 4 - 1 bis 5, damit kann man später besser weiterrechnen.
    iLeft := (ScrollBox1.ClientWidth - iWidth) div 2;
    iHeight := 120;
    iTop := iHeight + 8;
    iWidth := Scrollbox1.ClientWidth - 40;
    Scrollbox1.AutoScroll := False;
    Scrollbox1.VertScrollBar.Range := iTop * ICount;
    for i := 0 to 4 do
    begin
      FPDFView := TPdfView.Create(Self);
      FPdfView.Parent := Scrollbox1;
      FPdfView.Name := 'PdfView'+intToStr(i);
      FPdfView.Color := clyellow;

      FPdfView.Height := 120; //iHeight;
      FPdfView.Top := i * (FPdfView.Height + 8);
      FPdfView.Width := Scrollbox1.ClientWidth - 40;
      FPdfView.Left := (ScrollBox1.ClientWidth - FPdfView.Width) div 2;;
      FPdfView.Visible := true;
      FPdfList.Add(FPdfView);
     end;
  end
  else
    Showmessage('Die Seiten sind bereits vorhanden');
end;
Wieso mir allerdings unter Verwendung der i-Variablen nichts angrzeigt wirde, ist mir Schleierhaft...

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 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