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.
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.
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?
> 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
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
@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.
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?
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;
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.
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.
@ 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.
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
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
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
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.
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
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
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?
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...
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.
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
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!