Forum: PC-Programmierung C# - Event unterdrücken


von Hansbär (Gast)


Lesenswert?

Hi,

ich habe folgendes Problem mit einer Checkbox. Ich möchte beim Klicken 
der Checkbox eine bestimmte Routine ausführen. Allerdings kann diese 
Checkbox auch durch das Programm selbst gesetzt werden. Wenn aber das 
Programm die Checkbox setzt will ich nicht das die oben genannte Routine 
ausgeführt wird.

Meine Fragen:

- Kann ich erkennen wo ein Event ausgelöst wird um es dann in bestimmten 
Fällen zu ignorieren?

- Kann ich der Checkbox sagen, dass sie nur auf Klicks ein Event auslöst 
und bei setzen durchs Programm nicht?

Hoffe ihr könnt mir hier weiterhelfen, oder mir zumindest einen Begriff 
nennen, damit ich googlen kann.

von Peter II (Gast)


Lesenswert?

das event kannst du nicht unterdrücken, du must aber nicht darauf 
reagieren. Du kannst einfach z.b. im Proberty TAG der Checkbox eine 
Variabe setzen und diesen dann in dem Event auswerten.

von Hansbär (Gast)


Lesenswert?

Danke für den Tipp. Ich habe es so hinbekommen.

Jetzt habe ich aber eine letzte Frage. Ich bin gerade dabei meine GUI 
fertig zu stellen. Die GUI zeigt mehrere Segmente eines Roboters an, die 
je nach Bedingung aufleuchten. Jedes Segment einzeln. Dazu habe ich 20 
JPG´s erstellt, in denen jedes Mal ein anderes Segment aufleuchtet. Auf 
meinem PC funktioniert auch alles einwandfrei, da die Bilder mit 
absoluten Pfaden angegeben sind. Das Startbild habe ich im GUI Editor 
(Visual C# 2010 Express) eingestellt. Dieses wird auch in der fertigen 
*.exe angezeigt. Je nach Bedingung ändere ich das Bild mit:

pictureBox_table.Image = 
Image.FromFile("D:\\xxx\\xxx\\Bilder\\segFloat.JPG");

Möchte ich nun in meiner fertigen *.exe die Bilder anzeigen, wird eine 
Exception geworfen. Ich habe die Bilder aber in der Form1.resx 
importiert, da ich als erstes daran dachte. Die fertige exe ist dadurch 
auch um einiges Größer geworden, so das die Bilder schon irgendwo in der 
*.exe intergriert sind.

Hat jemand ne Ahnung?

von Ralf (Gast)


Lesenswert?

> Hat jemand ne Ahnung?
Klar, aber für was? Irgendwie fehlt da ne konkrete Frage :)

Wenn du die Bilder in die Ressourcen geklopft hast, braucht's natürlich 
den Pfad nicht mehr.
Und was jeder C#-Programmierer sich angewöhnen sollte ist, wenn er eine 
Exception erwähnt, sollte er auch deren Fehlermeldung und genaues 
Auftreten beschreiben :) Woher sollen wir sonst die Ursache wissen.

Ralf

von Sesk K. (zeborok)


Lesenswert?

Am besten relativ zu deiner Executable einen Ordner mit deinen Bildern.

...\Programm.exe
...\Bilder\...

Du brauchst dann nur einmal den Pfad deines Executables zu ermitteln und 
kannst daraus ja ganz leicht den rest ableiten:

String myPath = @Application.StartupPath + @"\\Bilder";

Alles weitere kannst du ja beliebig anhängen. @ erspart dir eine 
Ersetzung der \ durch \\.

Ist halt schlussendlich sicher etwas flexibler als fest eingebundene 
Bilder... Sind sie fest in den Resourcen, so musst du dann auch 
entsprechend darauf zugreifen...

Viele Grüße

von Peter II (Gast)


Lesenswert?

@Sesk K.

ich habe es jetzt nicht noch einmal nachgelesen, aber ich denke das 
@Application.StartupPath sehr ungünstig ist, das ist doch das 
Anwendungsverzeichniss. Dies stimmt aber nicht, wenn man die Anwendung 
absolut startet. Man muss der Verzeichniss vom den Executable nehmen.

von Hansbär (Gast)


Lesenswert?

Danke für die schnellen Antworten.

Wenn ich den Pfad so angebe:

Image.FromFile(@Application.StartupPath + @"\Bilder\tisch.JPG");

Dann steht in Application.StartupPath folgendes: 
D:\Projekte\xxx\xxx\bin\Debug\Bilder\xxx.JPG

Da soll er ja aber auch nicht nach den Bildern suchen?

Sind die Bilder richtig eingebettet wenn unter 
"Projektmappen-Explorer/Resources/ die Bilder drin liegen? Muss ich in 
den Eigenschaften der Bilder noch etwas einstellen? z.B. Buildvorgang 
auf "Eingebettete Resource" umstellen?

von Sesk K. (zeborok)


Lesenswert?

Peter II schrieb:
> @Sesk K.
>
> ich habe es jetzt nicht noch einmal nachgelesen, aber ich denke das
> @Application.StartupPath sehr ungünstig ist, das ist doch das
> Anwendungsverzeichniss. Dies stimmt aber nicht, wenn man die Anwendung
> absolut startet. Man muss der Verzeichniss vom den Executable nehmen.

Das ist das Verzeichnis, aus welcher die Anwendung gestartet wurde. D.h. 
egal wohin man diese kopiert bleibt der Rest ja relativ erhalten...

@Hansbär: Das war auch vielmehr eine Alternative zu den fest 
eingebundenen Resourcen. Auf die Resourcen musst du wahrscheinlich aber 
ja auch ganz anders zugreifen, etwa 
meinProjekt.Properties.Resources.meinTisch ...
Inwieweit der Compiler da automatisch was tauscht alsbald es in die Res 
importiert wurde weiß ich nicht.

Image myImage = meinProjekt.Properties.Resources.meinTisch;

von Peter II (Gast)


Lesenswert?

Sesk K. schrieb:
> Das ist das Verzeichnis, aus welcher die Anwendung gestartet wurde. D.h.
> egal wohin man diese kopiert bleibt der Rest ja relativ erhalten...

genau das ist ja das problem:

c:
cd \windows
c:\programme\test\test.exe

dann liefert es c:\windows zurück und das ist falsch.

von Hansbär (Gast)


Lesenswert?

Das heißt aber ich müsste einen Ordner mit Bildern immer mitführen. Ich 
möchte die Bilder aber mit ins Assembly reinbauen, damit ich nur "eine" 
Exe habe wo alles drin steckt.

von Sesk K. (zeborok)


Lesenswert?

@ Hansbär:

Image myImage = deinProjekt.Properties.Resources.deinBild;
pictureBox1.Image = myImage;

@ Peter II:

Nein, das ist nicht richtig! Ausgegeben wird der Pfad, in dem sich die 
Exec befindetr. "Aus welcher sie gestartet wurde" ist somit vllt. 
wirklich zweideutig zu verstehen, zugegeben.

von Hansbär (Gast)


Lesenswert?

deinBild kennt er nicht. Er meldet:

Fehler  2  "xxx.Properties.Resources" enthält keine Definition für 
"seg0x05".  D:\Projekte\xxx\xxx\Form1.cs  182  64  xxx


Wenn ich Image myImage = xxx.Properties.Resources.seg0x05.jpg; schreibe.

Mit seg0x05 gehts auch nicht

von Sesk K. (zeborok)


Angehängte Dateien:

Lesenswert?

Die MessageBox gibt StartupPath aus.

von Bernd H. (geeky)


Lesenswert?

Nein, es liefert den korrekten Pfad.
Schaut man via Reflector oder ILSpy in den Code sieht man das 
GetModuleFilename() aufgerufen wird und daraus der Pfad gezogen wird.

MS könnte das aber ruhig mal besser dokumentieren, ich hab früher auch 
immer Application.ExecutablePath + Path.GetDirectoryName() genommen weil 
ich da unsicher war ;D

von Peter II (Gast)


Lesenswert?

Bernd H. schrieb:
> MS könnte das aber ruhig mal besser dokumentieren, ich hab früher auch
> immer Application.ExecutablePath + Path.GetDirectoryName() genommen weil
> ich da unsicher war ;D

gut dann bin ich wenigsten nicht der einzigste

von Sesk K. (zeborok)


Lesenswert?

Hansbär schrieb:
> deinBild kennt er nicht. Er meldet:
>
> Fehler  2  "xxx.Properties.Resources" enthält keine Definition für
> "seg0x05".  D:\Projekte\xxx\xxx\Form1.cs  182  64  xxx
>
>
> Wenn ich Image myImage = xxx.Properties.Resources.seg0x05.jpg; schreibe.
>
> Mit seg0x05 gehts auch nicht

Beim tippen werden dir ja bereits Möglichkeiten Offeriert. Ist da nichts 
dabei? Auf welche Weise hast du die Resourcen eingebunden? "Resourcen 
hinzufügen"->"Vorhandene Datei"? Also funktionieren tut es anfürsich.

von Hansbär (Gast)


Lesenswert?

Ich habs jetzt so eingebunden wie du oben beschrieben hast.

Bei xxx.Properties.Resources. bietet er mir an:

Culture
Equals
ReferenceEquals
ResourceManager

aber keine Bilder

von Sesk K. (zeborok)


Lesenswert?

Hm, schon komisch... Vllt. kannst du das hier noch probieren:
1
System.Resources.ResourceManager rm = new System.Resources.ResourceManager(Properties.Resources.ResourceManager.BaseName, GetType().Assembly);
2
3
Image image = (Image)rm.GetObject ("meinBild");
4
5
pictureBox.Image = image;
Für meinBild den symbolischen Namen, welchen du gewählt hast. Also ohne 
.jpg .

von Bernd H. (geeky)


Lesenswert?

Wo liegt denn deine Resourcen-Datei? (*.resx)
Die muss nämlich nicht zwangsweise in Properties liegen, muss nicht 
Resources heißen und man kann außerdem gleich mehrere davon haben ;D

von Sesk K. (zeborok)


Lesenswert?

Bernd H. schrieb:
> Wo liegt denn deine Resourcen-Datei? (*.resx)
> Die muss nämlich nicht zwangsweise in Properties liegen, muss nicht
> Resources heißen und man kann außerdem gleich mehrere davon haben ;D

Genau und falls dem so ist, ersetzt du 
Properties.Resources.ResourceManager.BaseName gegen die entsprechende 
Angabe.

Vllt. liegt sie in einem anderen Namespace?

von Sesk K. (zeborok)


Lesenswert?

Du kannst hierzu einfach mal in deine .resx->.cs schauen, dort wird mit 
dem Namespace eröffnet und idR ist der dann eben Projekt.Properties. 
Sollte dem bei dir nicht so sein, kannst du eine der beiden Methoden von 
weiter oben darauf anpassen...

von Hansbär (Gast)


Lesenswert?

Meine Resourcen Datei liegt im gleichen Verzeichnis wie die Projektdatei 
und die *.cs Datei. Diese heißt bei mir Form1.resx. Ich habe eben 
bemeerkt, dass wenn ich im Projekt-Explorer auf Resourcen 
hinzufügen"->"Vorhandene Datei gehe, dann ist die EXE nur ca. 100kb 
groß. Wenn ich aber in VS die Form1.resx öffne und ziehe die Bilder dort 
rein, dann wird die EXE etwa 1MB groß. Das heißt die Bilder sind schon 
mit drin. Ich muss sie nur noch aufrufen können.

von Hansbär (Gast)


Lesenswert?

Sesk K. schrieb:
> System.Resources.ResourceManager rm = new 
System.Resources.ResourceManager(Properties.Resources.ResourceManager.Ba seName, 
GetType().Assembly);
>
> Image image = (Image)rm.GetObject ("meinBild");
>
> pictureBox.Image = image;

Funktioniert auch nicht, weil ich BaseName ebenfalls nicht angezeigt 
bekomme

von Hansbär (Gast)


Lesenswert?

Sooo...

jetzt hab ichs doch noch hinbekommen.

Scheinbar sind nur die statischen Bilder. Die zum Übersetzungszeitpunkt 
schon bestehen in der resx gespeichert. Dort sind nämlich nur drei 
statische Bilder von mir drin.

Ich habe die Bilder über den Projekt-Explorer in Properties/Resourcen 
hinzugefügt. Dann erscheinen sie im Ordner Resources im Explorer (dort 
liegen sie auch wenn man die Bilder direkt in die resx importiert.

Die Bilder rufe ich dann wie folgt auf:

pictureBox_table.Image = Projektname.Properties.Resources.bildname;

bildname ist nur der Name ohne .jpg, .bmp oder sonstiges.

Trotzdem vielen Dank für Eure mithilfe!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.