<?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[Problem mit Get-Methode]]></title><description><![CDATA[<p>ich habe das Problem, das ich in meinem Programm auf GetMethoden zugreifen muss wo das Objekt der Klasse noch gar nicht erzeugt wurde. Wie kann ich das machen? Ich müsste in der GetMethode eine Prüfung vornehmen, ob das Objekt erzeugt wurde also:</p>
<pre><code class="language-cpp">double __fastcall c_Emko::Get_Iw()
{
   if (???Objekt erzeugt???) return m_istwert;
   else return 0;
}
</code></pre>
<p>Wie mach ich das. Hab da so eine Ahnung, das dies mit this funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262247/problem-mit-get-methode</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 16:13:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262247.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Mar 2010 09:32:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 09:32:57 GMT]]></title><description><![CDATA[<p>ich habe das Problem, das ich in meinem Programm auf GetMethoden zugreifen muss wo das Objekt der Klasse noch gar nicht erzeugt wurde. Wie kann ich das machen? Ich müsste in der GetMethode eine Prüfung vornehmen, ob das Objekt erzeugt wurde also:</p>
<pre><code class="language-cpp">double __fastcall c_Emko::Get_Iw()
{
   if (???Objekt erzeugt???) return m_istwert;
   else return 0;
}
</code></pre>
<p>Wie mach ich das. Hab da so eine Ahnung, das dies mit this funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863646</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Wed, 03 Mar 2010 09:32:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 09:35:56 GMT]]></title><description><![CDATA[<p>Sorry aber das ist bullshit. Du musst niemals auf objekte zugreifen die noch nicht erstellt wurden. Wenn so etwas bei dir vorkommt dann ist das ein ganz grober Designfehler.<br />
Du musst das Objekt vorher erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863649</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Wed, 03 Mar 2010 09:35:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 09:39:53 GMT]]></title><description><![CDATA[<p>IN der Membermethode prüfen ob das Objekt bereits erzeugt wurde geht schlecht.<br />
Probleme sollten eh nur auftreten können im Zusammenhang mit Zeigern. Objekte im automatischen Speicher sind garantiert erzeugt, wenn du drauf zugreifen willst.<br />
Zeiger solltest du eh brav mit NULL initialisieren und vor einem Zugriff auch auf NULL prüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863652</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 03 Mar 2010 09:39:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 10:12:20 GMT]]></title><description><![CDATA[<p>da hab ich auch was falsches geschrieben, hab die Objekte über den Konstruktor der Formklasse initialisiert mit NULL. Also gibt es die Objekte schon. Bei den Klassen handelt es sich um Klassen, die eine Verbindung zu Messgeräten herstellen und die Messwerte in deren Membervariablen speichern. Da mein Programm diese Daten ständig ausliest kann es vorkommen, das das Messgerät noch gar nicht verbunden ist. Damit es keinen Speicherfehler gibt prüfe ich ob das Objekt erzeugt wurde und ob die Verbindung aktiv ist:</p>
<pre><code class="language-cpp">c_Edu32fp* TF_Gaszaehler::GetEdu32fp() //in der Form des Messgeräts
{
   if (o_Edu32fp!=NULL) return o_Edu32fp;
   else return 0;
}
</code></pre>
<p>//Klasse des Messgeräts:</p>
<pre><code class="language-cpp">double c_Edu32fp::ErfasseVolumen()
{
	if (this &amp;&amp; m_connect)
   {
   	char rec[50] = {0};
   	unsigned char send[] = {0x16};
   	while(m_port.ReceiveData(rec,1)&gt;0); //Buffer leeren
   	m_port.SendData(send,1);
   	m_port.ReceiveData(rec,50);
   	return StrToFloat(AnsiString(rec).SubString(4,9).Trim());
   }
   else return 0;
}
</code></pre>
<p>Prüfe ich mit this gibt es keinen Speicherfehler mehr wenn das Programm Daten sammelt obwohl das Gerät noch nicht verbunden wurde.<br />
Is alles etwas komplex.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863674</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Wed, 03 Mar 2010 10:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 11:31:30 GMT]]></title><description><![CDATA[<p>Was du da machst ist humbug. Du prüfst ob o_Edu32fp != NULL (was in C++ auch einfach nur 0 entspricht) und gibst 0 zurück wenn es 0 ist. Dann kannst du gleich 0 zurück geben.</p>
<p>rudpower schrieb:</p>
<blockquote>
<pre><code class="language-cpp">c_Edu32fp* TF_Gaszaehler::GetEdu32fp() //in der Form des Messgeräts
{
//   if (o_Edu32fp!=NULL) return o_Edu32fp;
//   else return 0;
     return o_Edu32fp;
}
</code></pre>
</blockquote>
<p>Dein fehler liegt einfach bei der verwendung von TF_Gaszaehler::GetEdu32fp().</p>
<pre><code class="language-cpp">double volumen = 0 ;
if( gas_zaehler.GetEdu32fp() ){ // Wenn nicht 0
   volumen = gas_zaehler.GetEdu32fp()-&gt;ErfasseVolumen();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863721</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Wed, 03 Mar 2010 11:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 13:03:18 GMT]]></title><description><![CDATA[<p>ja mit dem return 0 das ist quatsch <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>Das Programm ist umfangreicher, ich versuchs mal kurz zu zeigen:<br />
Habe eine Klasse c_Messwerte:</p>
<pre><code class="language-cpp">class c_Messwerte
{
   private:
      double m_volumen;
   public:
      double GetVolumen(void)const;
      void SetMesswerte(double p_vol);
};
c_Messwerte::c_Messwerte() : m_volumen(0.0) {}
void c_Messwerte::SetMesswerte(double p_vol) {m_volumen = p_vol;}
double c_Messwerte::GetVolumen(void)const {return m_volumen;}
</code></pre>
<p>dann hab ich eine Klasse für das Messgerät, hier c_Edu32fp:</p>
<pre><code class="language-cpp">class c_Edu32fp
{
private:
   bool m_connect;
   comclass m_port;
public:
   c_Edu32fp(AnsiString p_port);
   ~c_Edu32fp();
   bool GetConnect();
   double ErfasseVolumen();
};
c_Edu32fp::c_Edu32fp(AnsiString p_port) : m_connect(0)
{
   m_connect = m_port.OpenComm(p_port.c_str());
   if(m_connect)
   {
      m_port.SetDCB(9600);
      m_port.SetReadTimeouts(100, 10, 10);
   }
   else ShowMessage(&quot;Ritteruhr EDU32FP nicht verbunden!&quot;);
}
//---------------------------------------------------------------------------
c_Edu32fp::~c_Edu32fp() {if(m_connect) m_port.CloseComm();}
//---------------------------------------------------------------------------
double c_Edu32fp::ErfasseVolumen()
{
	if (this &amp;&amp; m_connect)
   {
   	char rec[50] = {0};
   	unsigned char send[] = {0x16};
   	while(m_port.ReceiveData(rec,1)&gt;0); //Buffer leeren
   	m_port.SendData(send,1);
   	m_port.ReceiveData(rec,50);
		return StrToFloat(AnsiString(rec).SubString(4,9).Trim());
   }
   else return 0;
}
bool c_Edu32fp::GetConnect() {return m_connect;}
</code></pre>
<p>Nun gibt es die Form für das Messgerät wo auch das Objekt erzeugt wird:</p>
<pre><code class="language-cpp">class TF_Gaszaehler : public TForm
{
...
private:
   c_Edu32fp* o_Edu32fp;
public:		
   ...
   c_Edu32fp* GetEdu32fp();
};
void __fastcall TF_Gaszaehler::Gaszaehler_B_PortOeffnenClick(TObject *Sender)
{
   o_Edu32fp = new c_Edu32fp(Gaszaehler_CB_Schnittstelle-&gt;Text); 
}
//---------------------------------------------------------------------------
c_Edu32fp* TF_Gaszaehler::GetEdu32fp()
{
   if (o_Edu32fp!=NULL) return o_Edu32fp;
}
</code></pre>
<p>diese GetMethode brauch ich um in einer Threadklasse darauf zuzugreifen:</p>
<pre><code class="language-cpp">class c_ThreadMesswerte : public TThread
{
   private:
      LONGLONG frequenz, alt, neu;
   protected:
	void __fastcall Execute();
   public:
      __fastcall c_ThreadMesswerte(bool CreateSuspended);
      void __fastcall VCLAccess();
};

__fastcall c_ThreadMesswerte::c_ThreadMesswerte(bool CreateSuspended)
	: TThread(CreateSuspended)
{
    QueryPerformanceFrequency((LARGE_INTEGER*)&amp;frequenz);
    Priority = tpHighest;
}
//---------------------------------------------------------------------------
void __fastcall c_ThreadMesswerte::Execute()
{
   QueryPerformanceCounter((LARGE_INTEGER*)&amp;alt);
   while(!Terminated)
   {
      QueryPerformanceCounter((LARGE_INTEGER*)&amp;neu);
      if ((neu-alt)/(double)frequenz &gt;= 0.1) Synchronize(VCLAccess);
      Sleep(1);
   }
}
//---------------------------------------------------------------------------
void __fastcall c_ThreadMesswerte::VCLAccess()
{
   F_HO-&gt;HO_E_AnzeigeGaszaehlerVolumen-&gt;Text = FloatToStr(F_Gaszaehler-&gt;GetEdu32fp()-&gt;ErfasseVolumen()); // Anzeige des Messwerts auf der Hauptoberfläche (HO)
}
</code></pre>
<p>Zusätzlich wird in der Formklasse der Hauptoberfläche alles in einem Vektor gespeichert. Hier wird auch der Thread gestartet oder pausiert.</p>
<pre><code class="language-cpp">class TF_HO : public TForm
{
private:
   std::vector&lt;c_Messwerte&gt;v_Messwerte;
   c_ThreadMesswerte* o_ThreadMesswerte;
   c_Messwerte o_Messwerte;
public:
   void ErfasseMessdaten(int AnzahlMesswerte);
};
void TF_HO::ErfasseMessdaten(int AnzahlMesswerte)
{
   o_Messwerte.SetMesswerte(F_Gaszaehler-&gt;GetEdu32fp()-&gt;ErfasseVolumen());
   v_Messwerte.reserve(AnzahlMesswerte);
   v_Messwerte.push_back(o_Messwerte);
}
</code></pre>
<p>Natürlich sind es noch viel mehr Messgeräte und Messwerte. Habe der Einfachheit halber mal alles rausgenommen und auch die Methoden der Forms usw rausgenommen.<br />
Die Daten werden auch noch gespeichert, angezeigt usw.<br />
Deshalb muss ich aufpassen, da eine Messung (in dem Fall starten des Threads und gleichzeitiges Füllen des Vektors) auch möglich sein soll wenn nicht alle Geräte verbunden sind. Es gibt einen Start Button, der den Thread startet (Resume) und gleichzeitig den Vektor füllt (zB 100 mal alle 1 Sek.).</p>
<p>Funktionieren tut es so, ausser dass es Probleme gibt bei der Typumwandlung AnsiString in double.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863769</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Wed, 03 Mar 2010 13:03:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 14:29:24 GMT]]></title><description><![CDATA[<p>was mich grad etwas wundert ist, dass m_connect beim Start nicht false ist obwohl ich es mit false initialisiere im Konstruktor. Das habe ich gerade mit dem Debugger erfahren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863821</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Wed, 03 Mar 2010 14:29:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 14:45:52 GMT]]></title><description><![CDATA[<p>Bei sowas</p>
<pre><code class="language-cpp">o_Messwerte.SetMesswerte(F_Gaszaehler-&gt;GetEdu32fp()-&gt;ErfasseVolumen());
</code></pre>
<p>Wunderst du dich über SegFaults?<br />
Wenn F_Gaszaehler-&gt;GetEdu32fp() NULL zurück liefert, passiert das ja.<br />
Du solltest da den Rückgabewert erst auf NULL prüfen (am besten speicherst du den) bevor du Funktionen darauf aufrufst.</p>
<p>Wo hast du dich mit dem Debugger reingehängt, um das m_connect zu überprüfen?<br />
Im übrigen ist m_connect ein bool und kein int, den darf man dann direkt mit &quot;false&quot; statt &quot;0&quot; initialisieren. Find ich persönlich einfacher, da ich gleich sehe &quot;Ah, bool&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863828</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 03 Mar 2010 14:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 15:10:51 GMT]]></title><description><![CDATA[<p>Du kannst das z.B. so machen:</p>
<pre><code class="language-cpp">o_Messwerte.SetMesswerte( 
      F_Gaszaehler-&gt;GetEdu32fp() 
    ? F_Gaszaehler-&gt;GetEdu32fp()-&gt;ErfasseVolumen()  // Wenn der zurück gegebene Zeiger nicht 0 ist, setze den Wert von ErfasseVolumen()
    : 0 // Wenn der Zeiger 0 ist dann setz 0 
);
</code></pre>
<p>Oder so, was das gleiche ist nur mit if else anstatt dem ternären operator</p>
<pre><code class="language-cpp">if( F_Gaszaehler-&gt;GetEdu32fp() ) { 
   o_Messwerte.SetMesswerte( F_Gaszaehler-&gt;GetEdu32fp()-&gt;ErfasseVolumen() ); // Wenn der zurück gegebene Zeiger nicht 0 ist, setze den Wert von ErfasseVolumen()
} else {
   o_Messwerte.SetMesswerte( 0 ); // Wenn der Zeiger 0 ist dann setz 0 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863847</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Wed, 03 Mar 2010 15:10:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 15:13:51 GMT]]></title><description><![CDATA[<p>ja ok, das mit dem bool leuchtet ein. Hab ich gleich mal geändert. Hab mich bei if (m_connect) mit dem Debugger reingehängt. Dann zeigt er an, dass m_connect==true obwohl kein Gerät verbunden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863850</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Wed, 03 Mar 2010 15:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 15:20:22 GMT]]></title><description><![CDATA[<p>rudpower schrieb:</p>
<blockquote>
<p>Dann zeigt er an, dass m_connect==true obwohl kein Gerät verbunden ist.</p>
</blockquote>
<p>Schau eine Zeile höher:</p>
<pre><code class="language-cpp">m_connect = m_port.OpenComm(p_port.c_str());
</code></pre>
<p>Da weist du dem m_connect einen neuen Wert zu. Wenn eine Zeile darunter m_connect nicht mehr false ist heißt das m_port.OpenComm() hat true zurück gegeben.<br />
Wenn also keine Verbindung besteht heißt das wiederum dass OpenComm Mist baut.<br />
Außer</p>
<pre><code class="language-cpp">{
      m_port.SetDCB(9600);
      m_port.SetReadTimeouts(100, 10, 10);
   }
</code></pre>
<p>machen m_port irgendwie ungültig. Da aber hier über comclass nichts bekannt ist kann man auch nichts darüber sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863858</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 03 Mar 2010 15:20:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 15:28:05 GMT]]></title><description><![CDATA[<p>hier ist die comclass:</p>
<pre><code class="language-cpp">// Öffnet den Port und gibt ein Handle zurück
bool comclass::OpenComm(char* port){
        hCom = CreateFile(port,// z.B. &quot;COM1&quot;,
        GENERIC_READ|GENERIC_WRITE,//zum Senden und Empfangen
        0, // Für comm devices exclusive-access notwendig
        0, // Keine security attributes
        OPEN_EXISTING, // Für comm devices notwendig
        0, // Kein overlapped I/O
        0); // Für comm devices muss hTemplate NULL sein

        if(hCom == INVALID_HANDLE_VALUE) return false;
           else return true;
}

// setzen der Einstellungen
void comclass::SetDCB(int baud){
        DCB dcb; // Device Control Block
        GetCommState(hCom, &amp;dcb); // DCB lesen

        dcb.BaudRate = baud; // Baudrate z.B.:9600
        dcb.ByteSize = 8; // 8 Datenbits
        dcb.Parity = NOPARITY; // keine Parity
        dcb.StopBits = ONESTOPBIT; // 1 Stopbit
        dcb.fDtrControl = 1;
        // SetCommState konfiguriert die serielle Schnittstelle
        SetCommState(hCom, &amp;dcb);
}

// setzen der Timeout-Zeiten
void comclass::SetReadTimeouts(int intervalTO, int readSingleTO, int writeSingleTO){
        COMMTIMEOUTS t;
        // Alle Wert in Millisekunden
        // Werte für ReadFile:
        t.ReadIntervalTimeout=intervalTO; // Zeit zwischen zwei Zeichen
        t.ReadTotalTimeoutMultiplier=readSingleTO; // pro Zeichen
        t.ReadTotalTimeoutConstant=readSingleTO;
        // Werte für WriteFile: wenn beide 0 sind, kein Timeout
        // beim Schreiben
        t.WriteTotalTimeoutMultiplier=writeSingleTO;
        t.WriteTotalTimeoutConstant=writeSingleTO;
        SetCommTimeouts(hCom,&amp;t);
}

// Daten senden
int comclass::SendData(char Data[],int n){
        DWORD NumberOfBytesWritten; //Anzahl der gesendeten Bytes
        WriteFile(hCom, // handle des Com-Ports
        Data, // Adresse der Daten
        n, // Anzahl der zu sendenden Bytes
        &amp;NumberOfBytesWritten, // Adresse übergeben
        0); // kein overlapped I/O

        return NumberOfBytesWritten;
}

// Daten empfangen
DWORD comclass::ReceiveData(char* Data,int n){
        DWORD NumberOfBytesRead; // Anzahl der gelesenen Bytes
        ReadFile(hCom, // handle des Com-Ports
        Data, // Adresse des Datenpuffers
        n, // Anzahl der zu lesenden Bytes
        &amp;NumberOfBytesRead, // Adresse übergeben
        0); // kein overlapped I/O

        return NumberOfBytesRead;
}

// schließen der seriellen Schnittstelle
void comclass::CloseComm(void){
     try {
     if(hCom) CloseHandle(hCom);
     } catch(...) {
     ;
     }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863867</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Wed, 03 Mar 2010 15:28:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 15:34:51 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">double c_Edu32fp::ErfasseVolumen()
{
	if (m_connect) //hier hatte ich den Haltepunkt gesetzt
        ....
}
</code></pre>
<p>Hier dürfte er ja gar nicht reinlaufen, da ich doch m_connect mit false im Konstruktor initialisiert habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863872</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Wed, 03 Mar 2010 15:34:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Wed, 03 Mar 2010 15:48:20 GMT]]></title><description><![CDATA[<p>Da er dort in die Schleife läuft gibt es denk ich mal meinen EConvertError &quot;&quot; ist kein gültiger Gleitkommawert.<br />
zeigt er in dieser Zeile an:<br />
&quot;F_HO-&gt;HO_E_AnzeigeGaszaehlerVolumen-&gt;Text = FloatToStr(F_Gaszaehler-&gt;GetEdu32fp()-&gt;ErfasseVolumen());&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863881</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Wed, 03 Mar 2010 15:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Thu, 04 Mar 2010 07:47:31 GMT]]></title><description><![CDATA[<p>ich glaube, das Problem ist, dass er den Konstruktor gar nicht aufruft, da dieser ja erst mit dem Klick auf den Button Gaszaehler_B_PortOeffnen aufruft. Normalerweise würde ich ja das Objekt im Konstruktor der Form F_Gaszaehler erzeugen. Da aber der Konstruktor der Klasse c_Edu32fp einen Parameter erwartet (den Namen der Schnittstelle) kann ich das nicht machen. Wie kann ich das Problem beheben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863889</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Thu, 04 Mar 2010 07:47:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Thu, 04 Mar 2010 13:11:59 GMT]]></title><description><![CDATA[<p>habe das Problem insoweit gelöst, dass ich nun in der Geräteklasse eine neue Methode erstellt hab, die den COM-Port öffnet und als Parameter diesen entgegennimmt. Den Konstruktor konnte ich so mit dem Konstruktor der Form aufrufen. So existiert das Objekt immer während der Laufzeit. Jetzt kann ich das Programm auch laufen lassen wenn das Gerät ausgeschaltet ist bzw man nicht den Button Port öffnen klickt, der ja die neue Methode öffnet. Verbindet man aber das Gerät (also ruft die Get Methode auf:</p>
<pre><code class="language-cpp">void c_Messgeraet::PortOeffnen(AnsiString p_port)
{
	m_connect = m_port.OpenComm(p_port.c_str());
   if(m_connect)
   {
      m_port.SetDCB(9600);
      m_port.SetReadTimeouts(100, 10, 10);
   }
   else ShowMessage(&quot;Messgerät nicht verbunden!&quot;);
}
</code></pre>
<p>und schaltet dann das Gerät ab hab ich wieder eine Exception. Dann funktioniert die Umwandlung String in double nicht mehr. Er versucht dann &quot;&quot; in double zu wandeln (also einen Leerstring). Das ist nicht gut. Das gleiche passiert beim einschalten, da das Gerät dann als String die Typbezeichnung sendet und die natürlich nicht in double gewandelt werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864242</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Thu, 04 Mar 2010 13:11:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Get-Methode on Fri, 05 Mar 2010 12:35:50 GMT]]></title><description><![CDATA[<p>nun funktioniert das soweit ganz gut. Hier meine Methode zur Erfassung:</p>
<pre><code class="language-cpp">double c_Messgeraet::ErfasseVolumen()
{
	if (m_connect)
    {
		char rec[50] = {0};
		unsigned char send[] = {0x16};
		while(m_port.ReceiveData(rec,1)&gt;0); // Buffer leeren
		m_port.SendData(send,1);
      m_port.ReceiveData(rec,50);
      try {return StrToFloat(AnsiString(rec).SubString(4,9).Trim());}
      catch(...)
      {
         m_connect = false;
         return 0;
      }
   }
   else return 0;
}
</code></pre>
<p>wenn das Gerät nicht verbunden ist, steht in dem Feld rec alles /0. Durch die Umwandlung in AnsiString und Trim bleibt dann nur ein Leerstring &quot;&quot;.Da dies nicht in ein Float umgewandelt werden kann fange ich dies mit try/catch ab. Das funktioniert.<br />
Beim Aufruf der Methode in meinem Thread wird dann im Editfeld entweder der Messwert ausgegeben oder der AnsiString &quot;getrennt&quot;:</p>
<pre><code class="language-cpp">if (F_Messgeraet-&gt;GetMessgeraet()-&gt;GetConnect())
   F_HO-&gt;E_AnzeigeVolumen-&gt;Text = FloatToStr(F_Messgeraet-&gt;GetMessgeraet()-&gt;ErfasseVolumen());
else F_HO-&gt;E_AnzeigeVolumen-&gt;Text = &quot;getrennt&quot;;
</code></pre>
<p>Problem gibt es in der PortOeffnen-Methode:</p>
<pre><code class="language-cpp">void c_Messgeraet::PortOeffnen(AnsiString p_port)
{
	m_connect = m_port.OpenComm(p_port.c_str());
   if(m_connect)
   {
      m_port.SetDCB(9600);
      m_port.SetReadTimeouts(100,10,10);
   }
   else
   {
      m_port.CloseComm();
      ShowMessage(&quot;Messgerät nicht verbunden!&quot;);
   }
}
</code></pre>
<p>Gebe ich jetzt nachdem verbunden wurde und die Messwerte auch angezeigt werden hier</p>
<pre><code class="language-cpp">void __fastcall TF_Messgeraet::B_OpenPortClick(TObject *Sender)
{
   o_Messgeraet-&gt;SetConnect(false);
	o_Messgeraet-&gt;PortOeffnen(E_SerialPort-&gt;Text); //Argument aus Editfeld
   Close();
}
</code></pre>
<p>einen anderen Port an zeigt er wie gewünscht &quot;getrennt&quot; an. Gebe ich nun wieder den richtigen Port an läuft er immer wieder in die else Verzweigung der PortOeffnen(AnsiString p_port)-Methode. Er setzt m_connect alo nicht auf true und verbindet nicht neu.<br />
Ich hab dann versucht einfach m_port.CloseComm(); vorher aufzurufen. Das gibt dann gleich eine &quot;externe Exception C0000008&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864709</guid><dc:creator><![CDATA[rudpower]]></dc:creator><pubDate>Fri, 05 Mar 2010 12:35:50 GMT</pubDate></item></channel></rss>