neues Fenster erstelln während der Laufzeit
-
Hallo,
ich bin dabei ein Progamm zu schreiben bei dem ich Bilder Umbenenne und Bildinformationen anzeigen möchte.
Ich habe in meinen Programmfenster 3 Images eingebettet auf den ich verschiedene Bilder anzeigen kann. Ich möchte nun auf das Image klicken und es soll einen neues Fenster aufgehen auf dem das Bild in Groß zu sehen ist.Wer kann mir diesbezüglich helfen.
Danke Ralf
-
Hallo
Womit hast du denn genau Probleme? Du hast doch schon gut beschrieben wie du vorgehen must.
bis bald
akari
-
Du erstellst dir ein weiteres Formular mit einem einzigen Image und evtl. einem Button "Schließen" in einer von dir gewählten Größe (z.B. Maximiert).
Dann rufst du in der Image-OnClick bzw. OnDblClick das obige Formular mit Show bzw. ShowModal auf. Mittels der Methode TImage::Assign kannst du dann das Image zuweisen bzw. du übergibst den Dateinamen und lädst das Bild dann mit Image->Picture->LoadFromFile ein.
Wenn du das Bild vergrößert angezeigt haben willst, aber den Aspect Ratio beibehalten willst, dann mußt du ein wenig Mathematik betreiben und die Werte für Width und Height entsprechend setzen (Stretch muß dann true sein).
-
Hallo Th,
und was wenn er mehrer Fenster offen haben will ? dann kommt man mit nur einem nicht aus.
Also hier mal mein Vorschlag. Du definiert die erst mal einen Zeiger auf eine TForm:
TForm *NewWindow = NULL;Dann erzeugst du mit new ein neues Element wenn auf das Minibild geklickt wird:
NewWindow = new TForm(Application);und machst du es nur noch sichtbar mit:
NewWindow->Visible = true;( Beim schließen des Programms nicht das freigeben des Speichers vergessen!)
if ( NewWindow != NULL ) delete NewWindow;Dann hast du schon mal das Fenster.
Wie man darin dann noch das Image darstellt, weiß ich im Moment auch noch nicht. Vielleicht hat dazu ja noch jemand anderes eine Idee.Pronto451
-
Hallo,
also hier mal mein SourceCode.
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "CLButton" #pragma resource "*.dfm" TForm1 *Form1; TForm *NewWindow = NULL; TImage *NewImage = NULL; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::CLButton1Click(TObject *Sender) { NewWindow = new TForm(Application); // Größe und Position des Fensters setzen NewWindow->Left = 200; NewWindow->Top = 200; NewWindow->Width = 1024; NewWindow->Height = 768; // Image Element erzeugen NewImage = new TImage(NewWindow); NewImage->Parent = NewWindow; NewImage->Align = alClient; // Image auf Fenstergröße ausdehnen NewImage->Visible = true; NewImage->Picture->LoadFromFile("test.bmp"); NewWindow->Visible = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { if ( NewImage != NULL ) delete NewImage; if ( NewWindow != NULL ) delete NewWindow; } //---------------------------------------------------------------------------Pronto451
-
weiß nciht, aber viell sollte erstmal die form, welche das image beinhaltet, erstmal angezeigt werden?
-
Hallo,
noch was. Beim berechnen der Fenstergröße mußt du die Fensterrahmenbreite und die Höhe der Titelleiste zu der Bildgröße hinzurechnen, sonst wird das Bild rechts und unten abgeschnitten. (War noch ein Prob bei dem Code oben)
Problem gelöst ?
Pronto451
-
@Pronto451: Dein SourceCode zeigt zwar bei mehrfachem Button-Click mehrere Fenster an, bei FormClose löschst du dann aber nur das zuletzt geöffnete Fenster. Um den Speicher wieder freizugeben, sollte im OnClose-Ereignis des Image-Formulars der Speicher selbst freigegeben werden (mittels Action = caFree).
Für einen Anfänger ist es wohl einfacher, wenn er das Formular mit dem Forular-Editor erstellt und dann anzeigt.
Auch wenn ich als professioneller Entwickler auch meistens die Formular-Elemente (so wie bei deinem Code) per Source-Code erstelle (um die einzelnen Elemente in dynamischen Arrays zu verwalten)...
Hier also meine Vorgehensweise:
#include "frmImage.h" // oder wie auch immer der Dateiname des Image-Formular bezeichnet ist void __fastcall TMainForm::Image1Click(TObject *Sender) { TImageForm *pImageForm = new TForm(Application); pImageForm->Show(); // bzw. ShowModal() wenn immer nur ein Bild gleichzeitig auf sein soll }Und in "frmImage.cpp" (Image-Formular) das OnClose-Ereignis :
void __fastcall TImageForm::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; }
-
Danke Th für die Info ... ich hab das ganze nur so in einigen Minuten zusammen gehauen und das war sicher noch nicht das Non plus Ultra
Weil ich das bisher aber noch nie gebraucht habe, wollte ich es mal ausprobieren.Pronto451