Edit Feld für IP Eingabe
-
Hallo,
ich würde gerne ein Editfeld erzeugen, wie in den Windows Netzwerk Einstellung, wo ich eine IP mit Punkten getrennt eingeben kann.
Ist das möglich? Wie geht man so was an?Gibts Beispiel Code dafür?
THX schon mal
-
Benutz dafür am besten die TMaskEdit-Komponente.
MittelsMaskEdit->EditMask = "990\\.990\\.990\\.990";
müßte es vier Zahlen (durch Punkt getrennt) entgegennehmen.
P.S. Eine direkte Benutzung des "IP Address Controls" gibt es unter http://www.swissdelphicenter.ch/torry/showcode.php?id=1132 zu sehen (zwar in Delphi, aber dies läßt sich ja einfach nach C++ umsetzen).
Hier noch ein Link in C++:
http://www.functionx.com/bcb/controls/ipaddress.htmEinige externe VCL-Komponenten dafür gibt es natürlich auch schon:
http://www.torry.net/quicksearchd.php?String=IP+Address&Title=YesUnd zu guter Letzt ein Link, warum man besser ein normales Edit-Feld benutzen soll: http://www.delphipraxis.net/topic162347_problem+mit+ipeingabefld.html
-
Danke th69,
ich hab das erste mal probiert mit MaskEdit, hat auch ohne Probleme gefunkt.
Doch ist schon bissl lästig, da das Format so was -> 127.0.0.1 nicht akzeptiert, das nimmt er nur so 127.000.000.001.Das letztere hab ich mir mal durchgelesen, ich frag mich warum für ihn Externe Komponenten nicht in Frage kommen hmm die will ich mir jetzt mal anschauen...
Hab mir mal die Zwei hier geladen "TIPEdit - an IP Address Editor Component v.1.0"
"TphIPAddress v.1.0"Dann im BCB 6 unter Komponenten versucht die einzufügen, doch das ist wohl nicht so gedacht, ist ja Delphi
Kann man die umbiegen?Ich Danke vielmals :))
-
alle Komponenten im BCB sind von Delphi bzw. haben Delphi-Quellcode
zum Einbinden von Delphi-Komponenten gibts auch einen Beitrag in den FAQ
-
Hallo,
hab mir mal den Spass gemacht, und den Code von dem Link (Beitrag von @Th69) umgesetzt. Wurde etwas modifiziert.
Header:
//--------------------------------------------------------------------------- #ifndef main_tipeditH #define main_tipeditH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <Commctrl.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- const DWORD IP_ADDRESS_ID = 0x0100; class TForm1 : public TForm { __published: TBevel *IPAddress; TButton *SetIP; TButton *ClearIP; TLabel *Label1; void __fastcall FormCreate(TObject *Sender); void __fastcall SetIPClick(TObject *Sender); void __fastcall ClearIPClick(TObject *Sender); protected: void __fastcall WndProc(Messages::TMessage &Message); private: long FIPAddress; HWND HIPAddress; public: __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
Source:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <function.h> #include "main_tipedit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { TInitCommonControlsEx lpInitCtrls; lpInitCtrls.dwSize = sizeof(TInitCommonControlsEx); lpInitCtrls.dwICC = ICC_INTERNET_CLASSES; if (InitCommonControlsEx(&lpInitCtrls)) { HIPAddress = CreateWindowEx(WS_EX_LEFT, WC_IPADDRESS, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, IPAddress->Left, IPAddress->Top, IPAddress->Width, IPAddress->Height, this->Handle, (HMENU)IP_ADDRESS_ID, HInstance, NULL); SendMessage(HIPAddress, IPM_SETFOCUS, 0, 0); } } //--------------------------------------------------------------------------- void __fastcall TForm1::WndProc(Messages::TMessage &Message) { long nField; switch (Message.Msg) { case WM_NOTIFY : { LPNMHDR pnmh = (LPNMHDR) Message.LParam; UINT idFrom = pnmh->idFrom; UINT code = pnmh->code; if ( idFrom == IP_ADDRESS_ID ) { switch ( code ) { case IPN_FIELDCHANGED: if (SendMessage(HIPAddress, IPM_ISBLANK, 0, 0) == 0) SendMessage(HIPAddress, IPM_GETADDRESS, 0, (LPARAM)(LPDWORD)&FIPAddress); } } break; } case WM_COMMAND: { if (Message.WParamLo == IP_ADDRESS_ID) { switch (Message.WParamHi) { case EN_SETFOCUS: nField = SendMessage(HIPAddress, IPM_GETADDRESS, 0, (LPARAM)(LPDWORD(&FIPAddress))); if (nField == 4 ) nField = 0; SendMessage(HIPAddress, IPM_SETFOCUS, (WPARAM) nField, 0); break; case EN_KILLFOCUS: if (SendMessage(HIPAddress, IPM_ISBLANK, 0, 0) == 0) SendMessage(HIPAddress, IPM_GETADDRESS, 0, (LPARAM)(LPDWORD)&FIPAddress); break; case EN_CHANGE: static char szIP_Adr[19]; GetWindowText( HIPAddress, szIP_Adr, 19 ); Label1->Caption = szIP_Adr; break; } } break; } } TForm::WndProc(Message); } //--------------------------------------------------------------------------- void __fastcall TForm1::SetIPClick(TObject *Sender) { FIPAddress = MAKEIPADDRESS(127, 0, 0, 1); SendMessage(HIPAddress, IPM_SETADDRESS, 0, (LPARAM)(DWORD)FIPAddress); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClearIPClick(TObject *Sender) { SendMessage(HIPAddress, IPM_CLEARADDRESS, 0, 0); } //---------------------------------------------------------------------------
Funktioniert bei mir schon beim BCB3
edit: Verbesserungen wären der Font und eine Tab-Funktion innerhalb HIPAddress.
Achso, aus dem Source kann <function.h> raus; war gedacht für ptr().mfg
kpeter
-
Sers,
das mit den Komponenten aus Delphi haut nit ganz hin.... Danke für den Verweis auf die Hife
@peter: Da hab ich mit diesem Code mehr Erfolg gehabt, hat zwar bissl gedauert, hab jetzt aber ein TBevel Komponete in der Form die echt gut funkt
Die Buttons usw. gehn zwar nicht, aber werd versuchen das in der Richtung weiter zu verfolgen.
Das ist genau das was ich mir vorgestellt hab, mal kucken wie ich damit arbeiten kann... Vielen Dank an Euch alle!
-
hawkdz schrieb:
Die Buttons usw. gehn zwar nicht...
Warum nicht ?
Im Objektinspektor klickst du das Ereignis OnClick des jeweiligen Buttons an und trägst den Code ein.
Hast du das gemacht?
-
ehm...
nja die sind doch damit bestückt...
void __fastcall TForm1::SetIPClick(TObject *Sender) { FIPAddress = MAKEIPADDRESS(127, 0, 0, 1); SendMessage(HIPAddress, IPM_SETADDRESS, 0, (LPARAM)(DWORD)FIPAddress); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClearIPClick(TObject *Sender) { SendMessage(HIPAddress, IPM_CLEARADDRESS, 0, 0); } //---------------------------------------------------------------------------
Aber passt schon, das bruch ich jetzt so auch nit