<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[2. Fenster aufrufen]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>also teilweise ist man stolz, dass man die kompliziertesten Dinge hinbekommt und dann scheitert man an absoluten Kleinigkeiten. Ich bitte daher nochmal freundlichst um Eure Hilfe:</p>
<p>In meiner Main.cpp mit</p>
<pre><code class="language-cpp">__fastcall TForm1::TForm1(TComponent* Owner)
</code></pre>
<p>habe ich am Anfang eingebaut:</p>
<pre><code class="language-cpp">Anweisung-&gt;Caption = &quot;Updateprüfung, bitte warten&quot;;
   Form1-&gt;Show();
   Application-&gt;ProcessMessages();
   versionspruefung = updatepruefung();
</code></pre>
<p>Wenn ein gewisser Wert zurückgeliefert wird, ist ein Update verfügbar.<br />
Um dem User das mitzuteilen, soll ein Infofenster (keine Messagebox) eingeblendet werden. Also:</p>
<pre><code class="language-cpp">if (versionspruefung == 1)   
   {
      Form_Update-&gt;Show();
      execl(&quot;Q:\\Updater.exe&quot;, &quot;Q:\\Updater.exe&quot;, NULL, NULL);
   }
</code></pre>
<p>Aber was ich zu sehen bekomme, ist leider nicht das Fenster &quot;Form_Update&quot;, sondern eine nette Fehlermeldung:</p>
<blockquote>
<p>Im Projekt AccessControl.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 400EE72E in Modul 'vlc60.bpl'. Lesen von Adresse 000002EC'. Prozeß wurde angehalten.</p>
</blockquote>
<p>Zumindest erhalte ich diese &quot;Luxusmeldung&quot;, wenn ich das Projekt aus dem Builder heraus starte. Starte ich die EXE direkt von der Platte, bekomme ich nur die Meldung &quot;EAccessViolation&quot; ohne Erklärung.</p>
<p>Die Form_Update.h habe ich selbstverständlich in die Main.cpp eingebunden.<br />
Der Fehler liegt ganz klar an der Zeile</p>
<pre><code class="language-cpp">Form_Update-&gt;Show();
</code></pre>
<p>denn wenn ich die als Kommentar markiere, läuft alles ohne Probleme.<br />
Aber dann beginnt halt direkt ohne Vorwarnung das Update und der User kriegt gar nicht mit, was da gerade passiert.</p>
<p>Kann mir bitte einer mein Brett vorm Kopf lösen und sagen, wie ich dieses zweite Fenster angezeigt bekomme?</p>
<p>DANKE.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/193842/2-fenster-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 03:52:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193842.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Sep 2007 19:15:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 2. Fenster aufrufen on Sun, 30 Sep 2007 19:15:22 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>also teilweise ist man stolz, dass man die kompliziertesten Dinge hinbekommt und dann scheitert man an absoluten Kleinigkeiten. Ich bitte daher nochmal freundlichst um Eure Hilfe:</p>
<p>In meiner Main.cpp mit</p>
<pre><code class="language-cpp">__fastcall TForm1::TForm1(TComponent* Owner)
</code></pre>
<p>habe ich am Anfang eingebaut:</p>
<pre><code class="language-cpp">Anweisung-&gt;Caption = &quot;Updateprüfung, bitte warten&quot;;
   Form1-&gt;Show();
   Application-&gt;ProcessMessages();
   versionspruefung = updatepruefung();
</code></pre>
<p>Wenn ein gewisser Wert zurückgeliefert wird, ist ein Update verfügbar.<br />
Um dem User das mitzuteilen, soll ein Infofenster (keine Messagebox) eingeblendet werden. Also:</p>
<pre><code class="language-cpp">if (versionspruefung == 1)   
   {
      Form_Update-&gt;Show();
      execl(&quot;Q:\\Updater.exe&quot;, &quot;Q:\\Updater.exe&quot;, NULL, NULL);
   }
</code></pre>
<p>Aber was ich zu sehen bekomme, ist leider nicht das Fenster &quot;Form_Update&quot;, sondern eine nette Fehlermeldung:</p>
<blockquote>
<p>Im Projekt AccessControl.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 400EE72E in Modul 'vlc60.bpl'. Lesen von Adresse 000002EC'. Prozeß wurde angehalten.</p>
</blockquote>
<p>Zumindest erhalte ich diese &quot;Luxusmeldung&quot;, wenn ich das Projekt aus dem Builder heraus starte. Starte ich die EXE direkt von der Platte, bekomme ich nur die Meldung &quot;EAccessViolation&quot; ohne Erklärung.</p>
<p>Die Form_Update.h habe ich selbstverständlich in die Main.cpp eingebunden.<br />
Der Fehler liegt ganz klar an der Zeile</p>
<pre><code class="language-cpp">Form_Update-&gt;Show();
</code></pre>
<p>denn wenn ich die als Kommentar markiere, läuft alles ohne Probleme.<br />
Aber dann beginnt halt direkt ohne Vorwarnung das Update und der User kriegt gar nicht mit, was da gerade passiert.</p>
<p>Kann mir bitte einer mein Brett vorm Kopf lösen und sagen, wie ich dieses zweite Fenster angezeigt bekomme?</p>
<p>DANKE.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375541</guid><dc:creator><![CDATA[W.Stecher]]></dc:creator><pubDate>Sun, 30 Sep 2007 19:15:22 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Sun, 30 Sep 2007 21:11:24 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Syntaktisch ist das schon in Ordnung. Nur ist Form_Update in der betreffenden Zeile ein ungültiger Pointer. Du must diesem erstmal eine gültige Form-Instanz zuweisen. Grundkenntnisse der Speicherverwaltung in C++ sind hier notwendig.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375595</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sun, 30 Sep 2007 21:11:24 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Sun, 30 Sep 2007 21:15:42 GMT]]></title><description><![CDATA[<p>Vermutlich existiert deine Form_Update (noch) nicht, es fehlt wohl die Speicherreservierung mittels <em>new</em>.</p>
<p>/edit: etwas getrödelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375596</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Sun, 30 Sep 2007 21:15:42 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Mon, 01 Oct 2007 14:47:38 GMT]]></title><description><![CDATA[<p>Hey und danke für Eure Antworten, aber ich glaube ich verstehe Euch nicht.</p>
<p>Ihr meint doch sicherlich:</p>
<pre><code class="language-cpp">TForm *Form_Update;
Form_Update = new TForm(this);
Form_Update-&gt;Visible = true;
</code></pre>
<p>oder?</p>
<p>Aber damit generiere ich doch während der Laufzeit ein ganz neues Fenster.<br />
Das will ich doch gar nicht.<br />
Ich hab doch mein Fenster (Form2 umbenannt in Form_Update) im Builder gebastelt.<br />
Dazu zugehörend der (wenn auch leere) Quellcode Updatehinweis.cpp.<br />
Die Updatehinweis.h ist in meine Main.cpp eingebunden (&lt;include&gt;).</p>
<p>Ich will doch einfach nur dieses Fenster, dass doch zur Laufzeit bereits bekannt ist (oder etwa nicht?) wenn eine Bedingung zutrifft einblenden.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Sorry, aber für ein kleines Stück Quellcode wäre ich echt dankbar, ich raff das gerde mal überhaupt nicht.</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1376054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1376054</guid><dc:creator><![CDATA[W.Stecher]]></dc:creator><pubDate>Mon, 01 Oct 2007 14:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Mon, 01 Oct 2007 15:15:15 GMT]]></title><description><![CDATA[<p>Wenn du in der Main-Source deines Projektes schaust, wirst du folgendes sehen:</p>
<pre><code class="language-cpp">WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	try
	{
		Application-&gt;Initialize();
		Application-&gt;CreateForm(__classid(TForm1), &amp;Form1);
		Application-&gt;CreateForm(__classid(TForm_Update), &amp;Form_Update);
		Application-&gt;Run();
	}
	catch (Exception &amp;exception)
	{
		Application-&gt;ShowException(&amp;exception);
	}
	return 0;
}
</code></pre>
<p>d.h. dein 2. Formular wird erst dann erzeugt, nachdem das 1. Formular komplett erzeugt wurde.</p>
<p>Du solltest nur im Konstruktor einer Form auf andere Objekte zugreifen, wenn du genau weißt, was du tust - hier anscheinend weißt du es nicht -)</p>
<p>Am besten du lagerst die Update-Prüfung in das Ereignis 'OnFormActivate' bzw. 'OnFormShow' aus. Evtl. mußt du dann ein Flag setzen, dass es nicht mehrmals aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1376070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1376070</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 01 Oct 2007 15:15:15 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Wed, 03 Oct 2007 20:36:59 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Versuch's doch mal so :</p>
<p>^Aufruf eines modalen Forms :^</p>
<pre><code class="language-cpp">Form2 = new TForm2(this);
Form2-&gt;ShowModal();
delete Form2;
Form2 = NULL;
</code></pre>
<p>^Aufruf eines nicht modalen Forms :^</p>
<pre><code class="language-cpp">Form2 = new TForm2(this);
Form2-&gt;Show();
</code></pre>
<p>^Deleten mußt das dann an geeigneter Stelle...^</p>
<p>Du mußt jetzt nur noch Deine Form-Namen einsetzen...</p>
<p>Alles ,außer dem Hauptformular, wird aus der Liste &quot;Automatisch erzeugen&quot; in die Liste &quot;Verfügbare Formulare&quot; gepackt. Jetzt kannst Du jedes verfügbare Form auch schon im Konstruktor des Hauptformulars aufrufen (wenn man das will).</p>
<p>Nash</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377475</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Wed, 03 Oct 2007 20:36:59 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Thu, 04 Oct 2007 18:35:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Du solltest nur im Konstruktor einer Form auf andere Objekte zugreifen, wenn du genau weißt, was du tust - hier anscheinend weißt du es nicht -)</p>
<p>Am besten du lagerst die Update-Prüfung in das Ereignis 'OnFormActivate' bzw. 'OnFormShow' aus. Evtl. mußt du dann ein Flag setzen, dass es nicht mehrmals aufgerufen wird.</p>
</blockquote>
<p>Danke für den Tip, daran bastel ich jetzt schon zwei Tage rum. Ich bekomme zwar damit mein zweites Fenster angezeigt, aber das Update nicht mehr ohne Fehler gestartet.<br />
Also mein Konstruktor macht jetzt nix mehr außer die Buttons im Hauptformular unsichtbar. Diese sollen erst sichtbar werden, wenn wirklich eine sinnvolle Funktion dafür geladen worden ist. Klappt auch.</p>
<p>Meine OnActivate sieht wie folgt aus:</p>
<pre><code class="language-cpp">void __fastcall TForm_Main::FormActivate(TObject *Sender)
{
   short int update = 0;

   if (activated == 0)
   {
      update = updatepruefung();      // Prüfung auf vorhandene Updates

      read_registry();       // Access-Pfade aus Registry einlesen
      newsanzeige();         // News anzeigen falls vorhanden
      path_ini_einlesen();   // DB-Pfade einlesen und Buttons aktivieren

      activated = 1;         // damit dieser Prozess nur einmal anläuft
   }
}
</code></pre>
<p>Und das ist der entsprechende Teil aus der Funktion updatepruefung:</p>
<pre><code class="language-cpp">Form_Update-&gt;Show();
      Application-&gt;ProcessMessages();
      ::Sleep(3000);
      Form_Update-&gt;Close();
      execl(&quot;Q:\\Anwendungen_DLZ\\Access Control\\AccessControlUpdater.exe&quot;, &quot;Q:\\Anwendungen_DLZ\\Access Control\\AccessControlUpdater.exe&quot;, NULL, NULL);
</code></pre>
<p>Er ruft zwar das Updateprogramm auf, bringt mir dabei aber den Fehler:<br />
&quot;Eigenschaft Visible kann in OnShow oder OnHide nicht verändert werden&quot;.<br />
Ich habe zwar für keines der beiden Ereignisse etwas programmiert, aber da &quot;execl ()&quot; die Anwendung, aus der es aufgerufen wird, schließt, nachdem die zu öffnende Anwendung erfolgreich geöffnet werden konnte, produziert dies diesen Fehler.</p>
<p>Also wenn ich das Ganze aus dem Konstruktor oder aber einer Funktion, die aus dem Konstruktor heraus aufgerufen worden ist, ausführe, dann bekomme ich eine &quot;Zugriffsverletzung bei Adresse ....&quot;.<br />
Wenn ich da Ganze aus dem Ereignis OnActivate oder OnShow bzw. einer Funktion, die aus OnActivate oder OnShow heraus aufgerufen wurde, ausführe, dann bekomme ich die Fehlermeldung &quot;Eigenschaft Visible kann nicht geändert werden&quot;.</p>
<p>Wenn ich wenigstens an was super kompliziertem Verzweifeln würde, dann ginge das ja, aber ich bin einfach nur zu blöd, aus einem Hauptfenster heraus ein zweites Fenster zu öffnen, wieder zu schließen und eine andere Anwendung aufzurufen, ohne mir zwischendurch einen Fehler einzufangen.</p>
<p>Bitte, bitte helft mir nochmal.</p>
<p>DANKE.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378122</guid><dc:creator><![CDATA[W.Stecher]]></dc:creator><pubDate>Thu, 04 Oct 2007 18:35:07 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Thu, 04 Oct 2007 18:51:51 GMT]]></title><description><![CDATA[<p>Nash schrieb:</p>
<blockquote>
<p>^Aufruf eines nicht modalen Forms :^</p>
<pre><code class="language-cpp">Form2 = new TForm2(this);
Form2-&gt;Show();
</code></pre>
<p>^Deleten mußt das dann an geeigneter Stelle...^<br />
Nash</p>
</blockquote>
<p>Danke, klappt. FREU * HÜPF * SPRING</p>
<p>Aber gestattet mir bitte trotzdem die Frage:<br />
Ist das jetzt ok, wenn ich im Konstruktor mein zweites Fenster aufrufe?<br />
Oder gibt es da Dinge die ich beachten sollte?<br />
Ich frage, weil ich diesen Satz ja durchaus ernst nehme:</p>
<pre><code>Du solltest nur im Konstruktor einer Form auf andere Objekte zugreifen,
wenn du genau weißt, was du tust - hier anscheinend weißt du es nicht -)
</code></pre>
<p>Und ich gebe es ja zu, dass ich es nicht weiß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378140</guid><dc:creator><![CDATA[W.Stecher]]></dc:creator><pubDate>Thu, 04 Oct 2007 18:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Fri, 05 Oct 2007 09:03:38 GMT]]></title><description><![CDATA[<p>Du kannst schon im Konstruktor ein 2. Formular aufrufen (oder sonstige beliebige Dinge machen), nur mir schien es so, daß du nicht so viel Ahnung von der Speicherverwaltung hast.</p>
<p>Wenn du jetzt also das 2. Formular nicht-modal aufrufst, dann solltest du nur dafür sorgen, daß es irgendwann wieder gelöscht wird. Da du es anscheinend nur einmalig in deinem Programm aufrufst, wird der Speicherverbrauch also nicht so groß sein, so daß es beim Löschen des Hauptformulars (beim Beenden des Programms) automatisch mitgelöscht wird.</p>
<p>Da du das 2. Fenster ja anscheinend nur als Info-Fenster temporär anzeigst, kannst du einfach das Erzeugen und Löschen selber durchführen:</p>
<pre><code class="language-cpp">TForm *frm = new TForm(this);
frm-&gt;Show();
Application-&gt;ProcessMessages();
::Sleep(3000);
frm-&gt;Close();
delete frm;
int nResult = execl(&quot;Q:\\Anwendungen_DLZ\\Access Control\\AccessControlUpdater.exe&quot;, NULL);
// check result
if(nResult == -1)
{
   // couldn't start update program
   // check global var 'errno'

   // ...
}
</code></pre>
<p>Bzgl. der Funktion 'execl': du brauchst den Dateinamen(incl. Pfad) nicht doppelt angeben (obiges reicht aus, außer du willst deiner Anwendung noch den eigenen Namen+Pfad als Parameter übergeben, aber das ist wohl unnötig).<br />
Außerdem solltest du den Rückgabewert prüfen (nResult, s.o.), denn es kann immer mal Probleme geben...</p>
<p>Auch solltest du evtl. den Pfad für das Update-Programm nicht fest im Quellcode ablegen (evtl. besser relativ zum eigentlichen Programm angeben, d.h. z.B. &quot;./AccessControlUpdater.exe&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378384</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 05 Oct 2007 09:03:38 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Fri, 05 Oct 2007 09:38:26 GMT]]></title><description><![CDATA[<p>Zum einen sollte man niemals die vorgebenen Namen für manuell erstellte Forms verwenden (wenn überhaupt, dann mit der CreateForm-Methode). Zum anderen wird mit dem Parameter (in diesem Fall this == vermutlich Form1) Form 1 zum Eigentümer des neu erzeugte Formulars und ist für die Freigabe verantwortlich... Meiner Meinung nach ist das so ziemlich unsauber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378419</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 05 Oct 2007 09:38:26 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Fri, 05 Oct 2007 13:26:21 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Joe_M. schrieb:</p>
<blockquote>
<p>Zum einen sollte man niemals die vorgebenen Namen für manuell erstellte Forms verwenden (wenn überhaupt, dann mit der CreateForm-Methode).</p>
</blockquote>
<p>Kannst Du das mal ein wenig ausführen, warum das unsauber ist ?<br />
Ich hab damit noch nie Probleme gehabt und ich programmiere nicht erst seit gestern...</p>
<p>Nash</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378622</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Fri, 05 Oct 2007 13:26:21 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Fri, 05 Oct 2007 13:34:17 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Wenn du den von der IDE vorgegebenen Pointer zum Form benutzt, dann machst du dich immer davon abhängig. Das geht nur solange wie du nur eine Instanz dieses Formes brauchst. Wenn du jemals dynamisch mehrere Instanzen der Formklasse brauchst must du immer über this gehen.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378627</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 05 Oct 2007 13:34:17 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Fri, 05 Oct 2007 15:20:37 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ja gut, OK. Den Fall hatte ich bisher eher selten, um nicht zu sagen eigentlich nie (soweit mir gerade einfällt)... doch einmal, in einer Bilderverwaltungs-DLL. Die konnte mehrfach aufgerufen werden. Da hatte ich das auch anders gelöst. Aber das ist für mich, wie gesagt, eher selten der Fall.</p>
<p>Aber so schlimm kann's auch nicht sein, denn sogar in der BCB-Hilfe (z.B.: Formulare dynamisch erstellen) wird das so gemacht... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Nash</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378705</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Fri, 05 Oct 2007 15:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to 2. Fenster aufrufen on Fri, 05 Oct 2007 17:27:59 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Du kannst schon im Konstruktor ein 2. Formular aufrufen (oder sonstige beliebige Dinge machen), nur mir schien es so, daß du nicht so viel Ahnung von der Speicherverwaltung hast.</p>
</blockquote>
<p>Ich sag es mal so: Ich tue mich schon ein wenig schwer, was Programmierung für Windows angeht. Ich habe C-Progammierung mit einem Borland Compiler unter DOS für DOS gelernt. Selbst als ich meinen ersten Borland Compiler unter Windows hatte, habe ich weiterhin für DOS programmiert. Und ich gebe ehrlich zu, dass zu dieser Zeit Anwendungen unter DOS entstanden sind, die ich mir unter Windows nicht zutrauen würde zu programmieren. So sicher wie ich in DOS bin, was ich mache, so unsicher bin ich unter Windows.<br />
Doch grundlegende Kenntnisse der Speicherverwaltung kann ich natürlich auch unter Windows weiter nutzen. Dazu zählt für mich ganz klar (auch in Zeichen von 4 GB RAM) arbeitsspeicherschonendes programmieren (z.B.: warum <em>int</em>, wenn auch <em>short int</em> möglich ist, warum global, wenn ich die Variable nur lokal benötige?) und natürlich auch alles, was ich irgendwann mal aufmache (z.B.: filestream, Formular) sofort wieder zu schließen, wenn ich es nicht mehr benötige.</p>
<p>Th schrieb:</p>
<blockquote>
<p>Bzgl. der Funktion 'execl': du brauchst den Dateinamen(incl. Pfad) nicht doppelt angeben (obiges reicht aus, außer du willst deiner Anwendung noch den eigenen Namen+Pfad als Parameter übergeben, aber das ist wohl unnötig).</p>
</blockquote>
<p>Ich hatte diesbezüglich eigentlich in der Hilfe nachgesehen, wie die Funktion aussieht:</p>
<pre><code class="language-cpp">int execl (char *path, char *arg0 ..., NULL);
</code></pre>
<p><em>Der Parameter path gibt den Dateinamen des untergeordneten Prozeßes an.<br />
Sämtliche exec-Funktionen müssen zumindest ein Argument an den untergeordneten Prozeß übergeben, nämlich arg0. Dieses Argument enthält per Konvention eine Kopie von path.</em></p>
<p>Und als Beispiel führt</p>
<pre><code class="language-cpp">execl(&quot;C:\\Programme\\Office\\msaccess.exe&quot;, &quot;C:\\Datenbanken\\Database.mdb&quot;);
</code></pre>
<p>nur dazu, dass Access geöffnet wird.<br />
Willst Du wirklich die Datenbank aufmachen, muss es</p>
<pre><code class="language-cpp">execl(&quot;C:\\Programme\\Office\\msaccess.exe&quot;, &quot;C:\\Programme\\Office\\msaccess.exe&quot;, &quot;C:\\Datenbanken\\Database.mdb&quot;);
</code></pre>
<p>heißen</p>
<p>Th schrieb:</p>
<blockquote>
<p>Außerdem solltest du den Rückgabewert prüfen (nResult, s.o.), denn es kann immer mal Probleme geben...</p>
</blockquote>
<p>Yepp, 100% Zustimmung. Mach ich auch noch.</p>
<p>Th schrieb:</p>
<blockquote>
<p>Auch solltest du evtl. den Pfad für das Update-Programm nicht fest im Quellcode ablegen (evtl. besser relativ zum eigentlichen Programm angeben, d.h. z.B. &quot;./AccessControlUpdater.exe&quot;).</p>
</blockquote>
<p>Werde ich wohl nicht hinbekommen, da die Anwendung lokal auf dem Rechner liegt und die &quot;Updater.exe&quot; auf verschiedenen Servern. Jedoch hat jeder PC immer nur einen von diesen Servern eingebunden und das immer unter Q:\[...].<br />
Ich möchte die &quot;Updater.exe&quot; auch nicht lokal auf die Rechner legen, weil diese definitiv noch weiterentwickelt werden wird. Wenn Sie aber lokal auf mehreren Rechnern liegt, dann komme ich da nicht mehr ohne weiteres dran.<br />
Und falls ich Änderungen an dieser (durch ein Update) vornehmen möchte, kann ich das dann nicht machen, da die Datei sich ja nicht selber austauschen kann wenn sie läuft.<br />
Überlegung daher:<br />
- Anwendung lokal, &quot;Updater.exe&quot; auf dem Server.<br />
- wenn Update vorhanden, Start der &quot;Updater.exe&quot; über execl<br />
- nach erfolgreichem Start der &quot;Updater.exe&quot; schließt sich die lokale Hauptanwendung selber, was ja in der Natur von execl liegt.<br />
Damit sind alle Dateien der lokalen Hauptanwendung geschlossen und austauschbar. Und eine neue Version der &quot;Updater.exe&quot; kann ich auf dem Server austauschen.</p>
<p><strong>Ich weiß ja nicht, wann ich das nächste Mal auf ein Problem stoße und Eure Hilfe benötige, daher an dieser Stelle schon mal ein gang ganz großes Dankeschön für Eure Unterstützung.</strong> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Ich werde auch hin und wieder mal reinsehen, vielleicht kann ich selber ja auch mal jemandem helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378784</guid><dc:creator><![CDATA[W.Stechr]]></dc:creator><pubDate>Fri, 05 Oct 2007 17:27:59 GMT</pubDate></item></channel></rss>