TNotebook macht Schwierigkeiten

Rund um die LCL und andere Komponenten
Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

TNotebook macht Schwierigkeiten

Beitrag von Boneless »

Hallo liebes Forum,

ich habe da mal eine Frage dem TNotebook betreffend.
Meine Hauptform ist auf einem TNotebook aufgebaut und habe auch um die 80 Seiten (möchte also nicht mehr umbauen auf z.B. TPageControl). Und man kann bekanntlich ja nur über den OI die Farbe des Hintergrundes vom TNotebook ändern. Ich möchte aber lieber ein Hintergrundbild bei jeder Page sehen. Momentan hab ich auf jeder Page (80x) das selbe Bild als TImage laden müssen (habe dann halt die Z-Reihenfolge geändert, sodass es wie ein Background Image ausschaut) und das frisst aber Speicher. Da mein Prog auf eine CD kommen soll, ist diese jetzige Lösung nicht hilfreich.

Wie ist es dann umzusetzen, dass die Pages des TNotebooks entweder alle das selbe Hintergrundbild verpasst bekommen, es aber nur einmal "geladen" wird oder das die Farbe o.ä. des TNotebooks transparent gemacht wird und ein TImage im TForm zu finden ist (also der TForm1 untergeordnet - im OI gesehen)

Wisst ihr so ziemlich, was ich gemeint habe? Ich würde mich auf eine hilfreiche Antwort sehr freuen

Gruß

Boneless

EDIT: Nach dem Suchen frag ich, ob man einer Color (Beispiel clNavy) dann einen transparenten Wert geben muss?

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: TNotebook macht Schwierigkeiten

Beitrag von Boneless »

Vielleicht hilft Euch das etwas auf die Sprünge (mich nicht so wirklich :D ) :

In der Unit Graphics gibt es proceduren und propertys namens
- SetTransparent
- GetTransparent und
- TransparentColor

Ich glaube schon, dass es etwas tiefgründiger ist, dies ganze hier. Aber ich als FPC Einsteiger.. das ist (noch) zu hoch für mich.. :)

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TNotebook macht Schwierigkeiten

Beitrag von Michl »

Boneless hat geschrieben:das selbe Hintergrundbild verpasst bekommen, es aber nur einmal "geladen" wird
Das könntest Du so realisieren:

Code: Alles auswählen

var
  Form1: TForm1;
  Image: TImage;   
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  Image:=TImage.Create(Self);
  Image.Stretch:=True;
  Image.Picture.LoadFromFile('C:\01\01.jpg');  //Hier das Hintergrundbild laden
  Image.Width:=NoteBook1.ClientWidth;
  Image.Height:=NoteBook1.ClientHeight; 
end; 
und bei jedem Wechsel der Page das Image der Page zuordnen z.B:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  NoteBook1.PageIndex:=NoteBook1.PageIndex + 1;
  Image.Parent:=NoteBook1.Page[NoteBook1.PageIndex];
end;
Beim Schließen wieder Image.free.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: TNotebook macht Schwierigkeiten

Beitrag von Boneless »

Hey Michl,

danke für deinen Denkanstoß.
Deine Prozedur beim FormCreate funktioniert auch noch. Aber beim PageWechseln haperts. Ich gebe mal den Code dazu

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i:Integer;
  Image:TImage;
begin
  FPanelArray[0].Panel:=Page1;
  FPanelArray[0].MenuItem:=MI_Page0;
  FPanelArray[1].Panel:=SiebenZip;
  FPanelArray[1].MenuItem:=MI_Page1;
  FPanelArray[2].Panel:=Animake;
  FPanelArray[2].MenuItem:=MI_Page2;
  FPanelArray[3].Panel:=AutoMouse;
  FPanelArray[3].MenuItem:=MI_Page3;
  FPanelArray[4].Panel:=CheatEngine;
  FPanelArray[4].MenuItem:=MI_Page4;
  FPanelArray[5].Panel:=Craagle;
  FPanelArray[5].MenuItem:=MI_Page5;
  FPanelArray[6].Panel:=Cube;
  FPanelArray[6].MenuItem:=MI_Page6;
  FPanelArray[7].Panel:=Dll_Icon_Maker;
  FPanelArray[7].MenuItem:=MI_Page7;
  FPanelArray[8].Panel:=Hex_Farbmischer;
  FPanelArray[8].MenuItem:=MI_Page8;
  FPanelArray[9].Panel:=JavaScript_Collector;
  FPanelArray[9].MenuItem:=MI_Page9;
  FPanelArray[10].Panel:=Lazarus64;
  FPanelArray[10].MenuItem:=MI_Page10;
for i:=0 to ANZAHL_PANELS do begin
    FPanelArray[i].Panel.Visible:=False;
    FPanelArray[i].Panel.Enabled:=False;
  end;
Image:=TImage.Create(Self);
  Image.Stretch:=True;
  Image.Picture.LoadFromFile('img\bgimg.jpg');  //Hier das Hintergrundbild laden
  Image.Width:=NoteBook1.ClientWidth;
  Image.Height:=NoteBook1.ClientHeight;
end; 
Soweit so gut. Also das Array geht auch noch weiter bis 80. Und um die Pages zu wechseln, benutze ich auch keine Button, sondern MenuItems. Bei jedem MenuItem ist das gleiche Event zugeordnet, namens ShowPanel

Code: Alles auswählen

procedure TForm1.ShowPanel(Sender: TObject); // OnClick Event der MenuItems
var
  i: Integer;
  Image: TImage;
begin
  for i:=0 to ANZAHL_PANELS do
    if Sender = FPanelArray[i].MenuItem then begin
      FPanelArray[i].Panel.Enabled := True;
      FPanelArray[i].Panel.Visible := True;
      FPanelArray[i].MenuItem.Checked := True;
    end else begin
      FPanelArray[i].Panel.Enabled := False;
      FPanelArray[i].Panel.Visible := False;
      FPanelArray[i].MenuItem.Checked := False;
    end;
    Notebook1.PageIndex:=Notebook1.PageIndex + 1;
    Image.Parent:=Notebook1.Page[Notebook1.PageIndex];
end;
Meiner Meinung nach passt PageIndex nicht da rein. Denn jede Page hat einen anderen Namen und nicht Page1, Page2, ... . Und einem PageIndex habe ich auch nicht jeder Page manuell zugeordnet. Das ist auch das, was die Anwendung zum Absturz bringt. 'Ne Idee wie das zu lösen ist?

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TNotebook macht Schwierigkeiten

Beitrag von Michl »

evtl so?!:

Code: Alles auswählen

procedure TForm1.ShowPanel(Sender: TObject); // OnClick Event der MenuItems
var
  i: Integer;
//  Image: TImage;
begin
  for i:=0 to ANZAHL_PANELS do
    if Sender = FPanelArray[i].MenuItem then begin
      FPanelArray[i].Panel.Enabled := True;
      FPanelArray[i].Panel.Visible := True;
      FPanelArray[i].MenuItem.Checked := True;}
      Image.Width:=FPanelArray[i].Panel.ClientWidth;
      Image.Height:=FPanelArray[i].Panel.ClientHeight;
      Image.Parent:=FPanelArray[i].Panel;
    end else begin
      FPanelArray[i].Panel.Enabled := False;
      FPanelArray[i].Panel.Visible := False;
      FPanelArray[i].MenuItem.Checked := False;
    end;
end;
Das Image müsste global oder in der Klasse TForm1 deklariert werden...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: TNotebook macht Schwierigkeiten

Beitrag von Boneless »

(Er gibt mir dann eine Fehlermeldung in der control.inc zurück:)

Code: Alles auswählen

begin
  {$IFDEF CHECK_POSITION}
  if CheckPosition(Self) then
  DebugLn('[TControl.SetWidth] ',Name,':',ClassName,' ',dbgs(Value));
  {$ENDIF}
  if csLoading in ComponentState then // Hier der Fehler
  begin
    FReadBounds.Right := FReadBounds.Left+Value;
    Include(FControlFlags, cfWidthLoaded);
  end;
  if [csDesigning, csDestroying, csLoading] * ComponentState = [csDesigning] then
    CheckDesignBounds;
  SetBounds(FLeft, FTop, Max(0, Value), FHeight);
end;  
EDIT:
Michl hat geschrieben:Das Image müsste global oder in der Klasse TForm1 deklariert werden...
Ja jetzt klappts, aber wie kann ich die Z-Reihenfolge noch ändern?

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TNotebook macht Schwierigkeiten

Beitrag von Michl »

Image.SendToBack; schon probiert?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: TNotebook macht Schwierigkeiten

Beitrag von Boneless »

Jo, läuft :)
Danke man :D das spart echt Speicher :mrgreen:

Aber beim FormCreate sitz ich noch aufm Schlauch. Bei FormCreate wird eine Seite des TNotebooks schon angezeigt. Und da soll das Bild auch schon rein. Habs versucht.. funzt aber nich

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TNotebook macht Schwierigkeiten

Beitrag von Michl »

Na da musst Du einfach nach dem Createn des Images das erste angezeigte Objekt als Parent des Images zuweisen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: TNotebook macht Schwierigkeiten

Beitrag von Boneless »

Hab ich das gemacht?

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i:Integer;
begin        
  Image:=TImage.Create(Self);
  Image.Stretch:=True;
  Image.Picture.LoadFromFile('img\bgimg.jpg');  //Hier das Hintergrundbild laden
  Image.Width:=Page1.ClientWidth;
  Image.Height:=Page1.ClientHeight;
  Image.Parent:=Page1;
  Image.SendToBack;
end;

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TNotebook macht Schwierigkeiten

Beitrag von Michl »

Wenn Page1 angezeigt wird, wenn Du das Programm startest, sollte der Code so funktionieren.

[Edit]: Wahrscheinlich liegt über der Page1 noch ein Panel, müsstest also das Panel als Parent nehmen
Zuletzt geändert von Michl am So 29. Dez 2013, 21:00, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: TNotebook macht Schwierigkeiten

Beitrag von Boneless »

Michl hat geschrieben:Wenn Page1 angezeigt wird, wenn Du das Programm startest, sollte der Code so funktionieren.
Funktioniert aber nicht.. :(

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TNotebook macht Schwierigkeiten

Beitrag von Michl »

Hatte eben noch Edit gemacht, was ich jetzt einmal geraten habe :roll:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: TNotebook macht Schwierigkeiten

Beitrag von Boneless »

Nee nee. Das ".Panel" in den Schleifen und Arrays, kommt nur zustande, weil ich mal statt TNotebook ein TPageControl hatte mit immerein FulllSize Panel drauf.. Wollte den Code bloß nicht ändern :D

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TNotebook macht Schwierigkeiten

Beitrag von Michl »

Boneless hat geschrieben: weil ich mal statt TNotebook ein TPageControl hatte
Daran kann ich mich erinnern. Das ändert aber nichts daran, dass IMHO entweder Page1 nicht beim Starten angezeigt wird oder Page1 von irgendwas übermalt wird.

Setz doch mal ein Objekt (TLabel, TEdit oder so) im Formular auf Page1 und schaue, ob dieses Objekt beim Starten angezeigt wird.

Ist aber schwierg zu raten, was da schiefläuft, bei der derzeitigen Informationslage.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten