Autor Beitrag
KillTrot
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 04.01.17 14:56 
Guten Tag,

Ich habe mir eine MainGUI gemacht, dessen Inhalt sich jenachdem ändern soll, weshalb ich auf UserControls zurückgreife.
Damit ich das Programm ohne weiteres Updaten kann, habe ich die UserControls in einer DLL gespeichert. Nun soll bei einem Button-Klick (der Button ist in diesem UserControl) die MainGUI versteckt, bzw. minimiert werden.
Wäre froh, wenn mir da jemand helfen könnte. (Bin noch ziemlich am Anfang mit C# :roll: )

Falls mehr Informationen gebraucht werden, nur fragen;)

MfG
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 04.01.17 16:24 
Hallo und :welcome:

um von untergeordneten Controls (oder Forms) auf das Hauptform zuzugreifen, verwendet man am besten Ereignisse (events), s.a. meinen Artikel Kommunikation von 2 Forms.

In der Ereignismethode (des Hauptforms) würdest du dann diese verstecken (Hide()) oder minimieren (WindowState = FormWindowState.Minimized).

Falls du nicht direkt damit weiterkommst, zeige doch bitte dann den (relevanten) Code.
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 04.01.17 17:13 
Danke für die Hilfe.
Ich werde deinen Artikel mal studieren und schauen, was sich damit anfangen lässt;)

Werde dann bescheid geben, wie weit ich damit gekommen bin.

Schönen Abend noch

Edit:

Ich werde daraus (leider) nun doch nicht ganz schlau...

Hier nun doch ein wenig Code, so kann man mir evtl. besser helfen:)--> Ich habe dir hier einfach das ganze Projekt hochgeladen (ist aber nur ein Beispielprojekt, anhand dessen man zeigen können sollte, wie es funktioniert):

drive.google.com/uc?...zVZlvakFWcG9pZkdXYms

Danke dir
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 04.01.17 17:43 
Man kann hier Attachments anhängen. Das wäre uns sicher lieber als auf irgendeine 3rd Party Seite verwiesen zu werden.
Dann bitte ohne Kompilate sondern nur den Code (heißt im Prinzip die obj und bin Ordner weglassen).


Zuletzt bearbeitet von Ralf Jansen am Mi 04.01.17 18:50, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: KillTrot
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 04.01.17 18:34 
Ok, danke für den Hinweis. Hier noch als Anhang und ohne die Kompilate (wenn ich alles richtig gemacht habe)
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 04.01.17 18:57 
In deinem UserControl erzeugst du einen Event und feuerst diesen Event aus dem Click Event des Buttons.
Etwa

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
// in class Benutzersteuerelement
private void button_HideMain_Click(object sender, EventArgs e)
{
    OnHideRequested();
}

public event EventHandler<EventArgs> HideRequested;

protected void OnHideRequested()
{
    var evt = HideRequested;
    if (evt != null)
        evt(this, EventArgs.Empty);
}


Und diesen Event fängst du dann auf der Form und machst das passende.
Also auf der Form das UserControl markieren in der EventListe des Controls dann den HideRequested Event raussuchen denn anklicken damit die Methode generiert wird und Hide() oder was auch immer passieren soll reinschreiben.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
//in Form1
private void benutzersteuerelement1_HideRequested(object sender, EventArgs e)
{
    Hide();
}

Für diesen Beitrag haben gedankt: KillTrot
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 05.01.17 01:27 
Danke dir, das funktioniert soweit. Ich hoffe, dass ich das schaffe, dies auf mein Programm anzuwenden.

Mit freundlichen Grüssen
KillTrot
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 05.01.17 18:55 
Sorry, dass ich das Thema noch ein mal öffne, aber ich habe noch eine Frage dazu:

Kann ich diesem Event auch zum Beispiel eine Int mitgeben, um mit einem Event verschiedene Aktionen durchzuführen, jenachdem, welche Int mitgegeben wurde?

MfG
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 05.01.17 19:06 
Ja. Aber wenn du eine Indikator für ein Kommando mitgeben willst dann nimm ein enum und nicht einfach einen int. Oder wenn das eine überschaubare Menge von unterscheidbaren Kommandos ist nimm jeweils einen anderen Event. Ein Button hat ja für Click und Button Pressed auch verschiedene Events und nicht für alles nur ein Event und man muß dann die EventArgs auswerten um zu unterscheiden was wirklich passiert ist.
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 05.01.17 19:09 
Würde es dir etwas ausmachen, das mit den Enums am oberen Beispiel schnell zu machen? Bin da ein totaler Anfänger.

Schönen Abend:)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 05.01.17 19:22 
Wie zuvor jetzt mit eigener EventArgs Klasse

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
private void button_HideMain_Click(object sender, EventArgs e)
{
    OnHideRequested(new HideRequestedEventArgs() { HideCommand = HideCommand.Hide });
}

public event EventHandler<HideRequestedEventArgs> HideRequested;

protected void OnHideRequested(HideRequestedEventArgs args)
{
    var evt = HideRequested;
    if (evt != null)
        evt(this, args);
}

// woanders enum und EvantArgs Klasse definieren
public enum HideCommand { None, Hide, Close };

public class HideRequestedEventArgs : EventArgs
{
    public HideCommand HideCommand { get; set; }
}


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//in Form1
private void benutzersteuerelement1_HideRequested(object sender, HideRequestedEventArgs e)
{
    switch (e.HideCommand)
    {
        case HideCommand.Hide:
            Hide();
            break;
        case HideCommand.Close:
            Close();
            break;
    }
}

Für diesen Beitrag haben gedankt: KillTrot
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 05.01.17 19:24 
Das steht aber auch so in meinem Artikel. ;-)


Zuletzt bearbeitet von Th69 am Do 05.01.17 19:26, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: KillTrot
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 05.01.17 19:26 
Danke dir!

Das wars wieder fürs Erste.

Schönen Abend:)
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 06.01.17 13:30 
@Th69 Stimmt, leider finde ich mich da irgendwie nicht so zurecht, wie ich es mir wünsche:)

Hätte doch noch eine Frage zu den Events mit Argumenten:
Ich kann ja mit der Art, die @Ralf Jansen mir gegeben hat, einen "Parameter" mitgeben, in dem Fall dient dieser dafür, was gemacht werden soll. So könnte ich ja dann zum Beispiel einmal mitgeben, dass er die MainGUI verstecken soll, und ein anderes Mal gebe ich mit, dass er diese "resizen" soll.
Wie kann ich nun beim "resize" zusätzlich noch Parameter mitgeben, wie er resizen soll? (Sprich die x und y Werte)?

Danke schonmal
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 06.01.17 13:51 
Na, indem du passende Eigenschaften in deiner EventArgs-Klasse implementierst.
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 06.01.17 13:55 
Muss mühsam sein mir zu helfen:/

Dies ist ja die EventArgs Klasse:
ausblenden C#-Quelltext
1:
2:
3:
4:
public class HideRequestedEventArgs : EventArgs
{
    public HideCommand HideCommand { get; set; }
}


Wie würde ich dies nun genau machen, um weitere Parameter mitzugeben?

Sorry, für meine "Unfähigkeit".

Danke für die Hilfe
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 06.01.17 14:27 
Genauso wie für die Property HideCommand. Du mußt dir halt nur einen anderen Namen ausdenken und den passenden Typen. Habe ich dich damit verwirrt das ich die Property genauso benannt habe wie den Typen der von der Property benutzt wird?
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 06.01.17 15:23 
Dementsprechend so?:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
public class HideRequestedEventArgs : EventArgs
{
    public HideCommand HideCommand { get; set; }
    public HideCommand ResizeSize {get; set; }
}
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 06.01.17 15:32 
Nur den Datentyp mußt du natürlich entsprechend setzen:
ausblenden C#-Quelltext
1:
public Size ResizeSize { get; set; }					

oder einzeln als
ausblenden C#-Quelltext
1:
2:
public int Width { get; set; }
public int Height { get; set; }

Das sind aber Grundlagen, die du beherrschen solltest, bevor du mit WinForms arbeitest.

Wenn Hide und Resize aber zwei verschiedene Aktionen sind, dann solltest du auch zwei verschiedene Events (inklusive EventArgs) verwenden.

Für diesen Beitrag haben gedankt: KillTrot
KillTrot Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 06.01.17 16:17 
Dann nutze ich verschiedene Events.

Wenn ich noch eine (fürs erste) letzte Frage stellen darf:
Wenn ich diese Parameter (int Width und Hight) gesetzt habe, wie gebe ich die dem Event mit, wenn der Button geklickt wird?

Wie empfiehlst du mir das Lernen dieser Grundlagen ohne WinForms, bzw. wie empfiehlst du das lernen allgemein?
Ich bin eher der Typ, der "learning by doing" macht und notfalls googlet oder um Hilfe fragt.

MfG