Muskampen 2025: Segraren korad!

c# / C Sharp Menybar som i windows

Permalänk
Medlem

c# / C Sharp Menybar som i windows

Hej, jag satt och skapade egna controler till visual c# och lyckades få en fungerande menybar, men den fungerar lite sådär, man kan ej trycka på krysset i hönet när man fått upp en ruta, då kmr erron att objektet har tagits bort, så jag vänder mig till lite flear hjärnor där ute, kan ni hitta nått jag måste lägga till för att få de o funka?

P.S: Detta är till ett "Fake OS" (Ett program som kör som OS) Vill du joina så gör hjärna de

Här är länk till nerladdning av komponenter: http://www.mediafire.com/?7dfyjuby8g9mw08

För att lägga till komponenterna i din toolbox högerklicka då, välj "Choose Items" på fliken ".NET"... väljd Browse gå sedan in i mappen och därifrån till: FormBar\bin\Debug

Jag är välldig tackssam för svar

Permalänk
Medlem
Skrivet av vpklotar:

Hej, jag satt och skapade egna controler till visual c# och lyckades få en fungerande menybar, men den fungerar lite sådär, man kan ej trycka på krysset i hönet när man fått upp en ruta, då kmr erron att objektet har tagits bort, så jag vänder mig till lite flear hjärnor där ute, kan ni hitta nått jag måste lägga till för att få de o funka?

P.S: Detta är till ett "Fake OS" (Ett program som kör som OS) Vill du joina så gör hjärna de

Här är länk till nerladdning av komponenter: http://www.mediafire.com/?7dfyjuby8g9mw08

För att lägga till komponenterna i din toolbox högerklicka då, välj "Choose Items" på fliken ".NET"... väljd Browse gå sedan in i mappen och därifrån till: FormBar\bin\Debug

Jag är välldig tackssam för svar

Du öppnar ett formulär och när användaren klickar på X så görs det en Close() och eller Dispose() implicit på formuläret. Alltså finns inte den instansen kvar längre.

"When the Close method is called on a Form displayed as a modeless window, you cannot call the Show method to make the form visible, because the form's resources have already been released. To hide a form and then make it visible, use the Control.Hide method."

Källa: http://msdn.microsoft.com/en-us/library/system.windows.forms....

Testa ha med denna kod i din FormButton-klass.

Ändra din konstruktor till:

public FormButton() { InitializeComponent(); Open.FormClosing += new FormClosingEventHandler(Open_FormClosing); }

Lägg till denna metod:

private void Open_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; Open.Hide(); }

Jag rekommenderar att byta namn på Open till något mer lämpligt, men det är en smaksak.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

En till fråga, du lade till en Closing event i runtime (eller va de nu en heter, när programmet körs), hur skriver man för att få Load event där?, jag har googlat och provat som F*N, men jag får det ej att fungera

Permalänk
Hedersmedlem
Skrivet av vpklotar:

En till fråga, du lade till en Closing event i runtime (eller va de nu en heter, när programmet körs), hur skriver man för att få Load event där?, jag har googlat och provat som F*N, men jag får det ej att fungera

Open.Load += new EventHandler(Open_Load);

Permalänk
Medlem

ok, tack så hemsk mycket :D, BTW gör de nått om jag frågar dig här igen om jag verkligen kör fast?, som nu t.ex så får jag de inte o funka att komma åt en public void från en annan form

Permalänk
Medlem
Skrivet av vpklotar:

ok, tack så hemsk mycket :D, BTW gör de nått om jag frågar dig här igen om jag verkligen kör fast?, som nu t.ex så får jag de inte o funka att komma åt en public void från en annan form

En public void vad?
Är du i samma namespace som klassen, dvs vet hur den ser ut?
Har du en referens till objektet du kallar, är det en statisk klass/metod/variabel?

Permalänk
Medlem

jag har på formen där from_bar ligger ett event som gör att jag tar bort en form_button och den är en public void här är koden:

public void remove_form_button(Form SRC_form) { foreach(Control control in userControl11.Controls) { //Event } }

Men, jag kan inte komma åt den ifrån en annan form

Permalänk
Medlem
Skrivet av vpklotar:

jag har på formen där from_bar ligger ett event som gör att jag tar bort en form_button och den är en public void här är koden:

public void remove_form_button(Form SRC_form) { foreach(Control control in userControl11.Controls) { //Event } }

Men, jag kan inte komma åt den ifrån en annan form

Det är väldigt svårt att veta vad du menar.
Om du inte har en referens till objektet så kan du inte påverka objektet.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Hedersmedlem
Skrivet av Leedow:

Om du inte har en referens till objektet så kan du inte påverka objektet.

Man skulle väl kunna tänka sig en lösning med statiska händelser och hanterare?

Permalänk
Medlem

Elgot, men en static kan man ej hantera strings o sånt, iallafall vad jag har upplevt

Leedow, vad menar du med en referens till objektet?

Detta är all kod till Main.cs:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Carbon_OS { public partial class Main : Form { Point mouse_move = new Point(0,0); Point a_B = new Point(0,0); Point mouse_move_2 = new Point(0, 0); public Main() { InitializeComponent(); } private void panel4_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouse_move = e.Location; } } private void panel4_MouseDown_1(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouse_move = e.Location; } } private void panel4_MouseMove_1(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) a_B.X = e.X - mouse_move.X; int wd = bottom_panel.Width + 37 + a_B.X; if (wd > bottom_panel.Width) { if (wd == bottom_panel.Width) { } else { bottom_panel.Width = bottom_panel.Width - 37; } } else { bottom_panel.Width = bottom_panel.Width + a_B.X; } } private void main_form_Load(object sender, EventArgs e) { } public void remove_form_button(Form SRC_form) { foreach(Control control in userControl11.Controls) { //Event } } private void panel2_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouse_move = e.Location; } } private void panel2_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { int m = e.X - mouse_move.X; if (bottom_panel.Width + bottom_left_container.Width + bottom_right_container.Width + clock_panel.Width > panel1.Width) { bottom_panel.Width = panel1.Width - clock_panel.Width - bottom_right_container.Width - bottom_left_container.Width; } else { bottom_panel.Width = bottom_panel.Width + m; } } } private void timer1_Tick(object sender, EventArgs e) { string a = DateTime.Now.Hour + " : "; string b = DateTime.Now.Minute.ToString(); if (b.Length == 1) { b = "0" + b; a = a + b; } else { a = a + b; } clock_lbl.Text = a; } private void panel3_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouse_move_2 = e.Location; } } private void panel3_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { int m = e.X - mouse_move_2.X; if (clock_panel.Width + bottom_left_container.Width + bottom_right_container.Width + bottom_panel.Width > panel1.Width) { clock_panel.Width = panel1.Width - bottom_panel.Width - bottom_right_container.Width - bottom_left_container.Width; } else { clock_panel.Width = clock_panel.Width - m; } } } private void panel2_Paint(object sender, PaintEventArgs e) { } private void panel4_MouseDown_2(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouse_move = e.Location; } } private void panel5_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouse_move_2 = e.Location; } } private void panel4_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { int m = e.X - mouse_move.X; if (bottom_left_container.Width + bottom_right_container.Width == panel1.Width) { int mo = e.X - mouse_move.X; int mov = bottom_left_container.Width + m; if (mov < bottom_left_container.Width) { bottom_left_container.Width = bottom_left_container.Width + m; } } else if (bottom_left_container.Width + bottom_right_container.Width > panel1.Width) { bottom_left_container.Width = panel1.Width - bottom_right_container.Width; } else { bottom_left_container.Width = bottom_left_container.Width + m; } } } private void panel5_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { int m = mouse_move_2.X - e.X; if (bottom_right_container.Width + bottom_left_container.Width == panel1.Width) { int mov = bottom_right_container.Width + m; if (mov < bottom_right_container.Width) { bottom_right_container.Width = bottom_right_container.Width + m; } } else { bottom_right_container.Width = bottom_right_container.Width + m; } } } private void timer2_Tick(object sender, EventArgs e) { Form a = new Form(); Random r = new Random(); a.Text = r.Next(1, 1337).ToString(); userControl11.Add_New(Properties.Resources.C_OS, a.Text, a); } } }

Permalänk
Medlem
Skrivet av Elgot:

Man skulle väl kunna tänka sig en lösning med statiska händelser och hanterare?

Jag lyssnar men hänger inte riktigt med. Hur ska du kunna ändra egenskaper på ett objekt utan att ha tillgång till objektet?

Edit:
Ok, nu tänkte jag igenom det. Tänker du dig någon slags ESB-lösning där alla objekt lyssnar på alla events? Det känns inte helt hållbart, men det är klart det är möjligt.

Skrivet av vpklotar:

Elgot, men en static kan man ej hantera strings o sånt, iallafall vad jag har upplevt

Leedow, vad menar du med en referens till objektet?

Jodå, det kan man.

Nu pastade du koden till din klass Main som ärver ifrån Form.

När du skapar en Main så gör du typ:
Main mymain = new Main();
I detta fall är mymain en instans/referens till objektet. Då kan du skriva:
mymain.remove_form_button(); //Denna metod kräver en form som argument, men den verkar inte användas.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Hedersmedlem
Skrivet av Leedow:

Ok, nu tänkte jag igenom det. Tänker du dig någon slags ESB-lösning där alla objekt lyssnar på alla events? Det känns inte helt hållbart, men det är klart det är möjligt.

Jo, det var något sådant jag tänkte på. Och nej, det känns sällan som den bästa lösningen.

Permalänk
Medlem

men om jag gör de där med new main(), då kommer den att skapa en ny main, så de fungerar iallafall inte

Edit: I Visual Basic skriver man ju bara FormName.EventName

vrf kan de inte va lika simpelt i c# xD

Permalänk
Hedersmedlem
Skrivet av vpklotar:

men om jag gör de där med new main(), då kommer den att skapa en ny main, så de fungerar iallafall inte

Edit: I Visual Basic skriver man ju bara FormName.EventName

vrf kan de inte va lika simpelt i c# xD

Det är nästan lika enkelt. Någonstans skapar du väl Form2-objektet, till exempel som:

Form2 f = new Form2(); f.show();

Om du sedan håller reda på f kan du, förutsatt att du deklarerar Form2::form2_formClosing(object sender, FormClosingEventArgs e) som publik till empel i form1 skriva:

this.FormClosing += new FormClosingEventHandler(f.form2_formClosing);

Permalänk
Medlem

ok, tack ska prova det

Permalänk
Medlem

tror ni det skulle gå att spara "länken" till main.cs (form) i en DLL eller i settings lr nått? då kan man ju bara gå till ja t.ex settings o säga att just den formen som är angedd ska skall det hända på?

Permalänk
Medlem

de där med formen i settings fungerade