ini Key immer ein wert größer (++)
-
Blackhawk schrieb:
hi, ich glaube, so müssts gehen:
#include <IniFile.h> //oder so ähnlich void __fastcall TForm1::Button1Click(TObject *Sender) { TIniFile *ini=new TIniFile(FileName); for(int i=1;i<1000;i++) //das müsste reichen *g* if(ini->ReadString("Name",IntToStr(i),NULL)) int x=i; ini->WriteString("Name",x++,(LabeledEdit1->Text)); delete ini; //WICHTIG }bin mir aber nich sicher
das dürfte eine Fehlermeldung bringen, da das x nicht bekannt ist in der WriteString-Answeisung...
|23| schrieb:
gut verstanden, wie kann ich aber nur der Schlüssel auslesen lassen ?
if(ini->ReadSection("Name"...?????...) ???statt der ????? solltest du eine StringListe schreiben und dann erhälst du mit Count die Anzahl der in der Section enthaltenen Einträge
als Bespiel:
TStringList *sList = new TStringList; ini->ReadSection("Name", sList); i = sList->Count; delete sList;
-
nur als anmerkung:
i=sList->Count+1;sonst überschreibst du den letzten eintrag
-
ini->ReadSection("Name",sList); int i = sList->Count+1; delete sList; ini->WriteString("Name", IntToStr(sList),(LabeledEdit1->Text)); delete ini;geht ned
-
Hast du schonmal programmiert? Kannst du dir eventuell vorstellen, dass...
1. sList kein Integer sondern TStringList ist, die Funktion einen Integer erwartet
2. sList zuvor gelöscht wurde, mit delete...Es muss also heißen:
ini->ReadSection("Name",sList); int i = sList->Count+1; delete sList; ini->WriteString("Name", IntToStr(i),LabeledEdit1->Text); delete ini;Wobei delete ini vielleicht nicht so toll ist, wenn du nämlich nochmal auf den Button klickst, wird dein Objekt ini weg sein... und eine Zugriffsverletzung auftreten. Mach das delete ini; lieber in OnCloseQuery der Form.
-
Ausbildung zum Fachinformatiker - Anwendungsentwicklung <- irgendwie glaub ich immer weniger dran... tut mir leid, is aber so. wie lange bist du schon in der ausbildung?
-
@Blackhawk
jetzt genau 3 wochen.
seit 2 wochen an c++ und zuvor keine andere Programmiersprache gelernt.1. hab wohl aus furst dumme fehler gemacht! weiss jetzt auch nicht wirklich wie ich drauf komme IntToStr zu schreiben da es ja StrToInt sein muss
2. hast vollkommen recht
trotzdem geht das immer noch nicht. jetzt überschreib er einfach den ersten wert und gut ist..
-
kk dann is ok
ich bin jetz in der 8. woche
aber keine ausbildung
hobby halt
-
Danke das keine merh geantwortet hat, den ich hab es geschaft also jetzt geht es sauber und die lösung war so einfach.. das sagt mir das ich noch mehr lernen muss(und will).
Lösung
if(LabeledEdit1->Text =="") { Application->MessageBox("Bitte tragen Sie einen Namen in das Feld ein.","Keine Einträge", MB_OK); } else if(LabeledEdit2->Text == "") { Application->MessageBox("Bitte Tragen Sie einen Nummer in das Feld ein.","Keine Einträge", MB_OK); } else { ini->ReadSection("Name",sList); int g1 = sList->Count+1; for(int i = 0; i < g1 ; i++) ini->WriteString("Name", g1,(LabeledEdit1->Text)); ini->ReadSection("Nummer",sList); int g2 = sList->Count+1; for(int i = 0; i < g2 ; i++) ini->WriteString("Nummer", g2,(LabeledEdit2->Text)); Application->MessageBox("Der Eintrag wurde gespeichert","Gespeichert", MB_OK); }
-
Also Ziel ist es ja, den Quelltext so kurz wie möglich und doch übersichtlich zu halten, und das Programm zu optimieren, auf Geschwindigkeit, etc. Es wird sich bei dem Code vermutlich nicht bemerkbar machen, aber schreib das hier statt deinem Code hin:
if (LabeledEdit1->Text!="" && LabeledEdit2->Text!="") { ini->ReadSection("Name",sList); ini->WriteString("Name",IntToStr(sList->Count+1),LabeledEdit1->Text); ini->ReadSection("Nummer",sList); ini->WriteString("Nummer",IntToStr(sList->Count+1),LabeledEdit2->Text); Application->MessageBox("Der Eintrag wurde gespeichert","Gespeichert",MB_OK); } else { Application->MessageBox("Bitte alle Felder ausfüllen.","Fehler",MB_OK); }Folgende Änderungen:
- Keine Extra-Integer-Variablen verwendet
- Keine for-Schleifen, die unnötig waren
- Korrekte Umwandlung von Integer zu AnsiString
- Quelltext kurz und übersichtlich gehalten
-
Zum Gesamtansatz: Es hat natürlich ein bischen was von Glücksspiel, sich darauf zu verlassen, dass die Zahl der Einträge in einem Abschnitt auch mit der höchsten vergebenen Nummer übereinstimmt (von der Reihenfolge mal ganz abgesehen).
Schliesslich sind das einfache Textdateien, in denen Einträge leicht manuell gelöscht, geändert oder umgruppiert werden können.Wenn man jedoch davon ausgeht, dass die Integrität der Daten garantiert ist, dann kann man auf das zweite ReadSection auch verzichten, da logischerweise beide Listen immer gleich lang sein müssen.
-
Windoof schrieb:
Also Ziel ist es ja, den Quelltext so kurz wie möglich und doch übersichtlich zu halten,
Falsch...
Es ist wichtig ein Programm so übersichtlich wie möglihc. Aber nur so kurz wie nötig zu machen.
Optimieren tut dein Compiler schon. Da brauchste nur selten dem Teil unter die Arme zu greifen. Der Compiler kann das ohnehin (meist) besser als der Programmierer.
wennde selber alle Optimierungen machen willst, dann fang an assembler zu programmieren.Aktionen wie
Windoof schrieb:
- Keine Extra-Integer-Variablen verwendet
zum Beispiel sorgen eher für mangelnde Übersichtlichkeit und massiv erschwertes Debugging.
Windoof schrieb:
- Quelltext [...] übersichtlich gehalten
N.E.F. aka. Nicht Erfüllt!
-junix
-
@Windoof.
danke für die Tipps klar schaut dein Code im gegen Satz zu meinem sauber und übersichtlich aus. Aber jetzt mal ganz ehrlich sah dein Code auch so aus nach deiner dritten Woche c++ programmieren? ok wenn du zuvor andere Sprache kanntest da ist das was anderes.. ich will damit nur sagen dass ich noch ned so erfahren bin in der Programmierung. Und ich glaub niemand der programmieren gelernt hat, hat schon von Anfang an sauber geschrieben, oder ? der will ich sehen na ja ok vielleicht beispiele angeschrieben
aber das zählt ja ned :D.Ist den mein Code so schlecht?
mfg
|23|
-
@Windoof: Japro hat hier übrigens was sehr intelligentes geschrieben:
http://www.c-plusplus.net/forum/viewtopic.php?p=591373&highlight=#591373-junix
-
Eine weiterführende Diskussion ob die Zerstümmelung von Quelltext sinnvoll ist um Optimierungen zu erreichen findet sich hier:
http://www.c-plusplus.net/forum/viewtopic.php?t=84106-junix
-
Ey junix, jetzt werd ich sauer, knall meinen Beitrag sofort wieder hier herein, er gehört hierhin. Schließlich hab ich |23| einen Tipp gegeben, etc.
EDIT: Oder verträgst du etwa keine Kritik...? Ahso, das wusste ich nicht, na dann lösch nur sinnlos weiter Beiträge.
-
Wo wurde denn was gelöscht du Eule? Er gehört ebenso hier hin wie er in den neuen Thread reingehört. Punkt. Gelöscht wurde hier garnix. Hättest vielleicht besser mal gelesen was hier noch in den anderen Beiträgen steht. Aber das das nicht deine Stärke ist, wissen wir ja alle unterdessen. Und von einem Tip - ausser der Eigenwerbung die sich als Tip tarnt - kann ich in deinem EBitrag nichts erkennen.
Hör mal auf mit deinem kindischen genöle und mach die Augen auf. Und selbst wennich hier was gelöscht hätte (was ich nicht habe), dann habe ich die Kompetenz und den Ermessensfreiraum dazu vom Admin erhalten. Wenn dir was an meiner Lösch-/Verschiebe-/Trennstrategie nicht passt, beschwer dich in einem Extrathread im Themen rund um Offtopic oder nadrwf oder per direktem Mail an Marcus. Das hatte ich dir schon oft genug erklärt. UNd langsam frageich mich wieso ichs immer wieder tue...
Weitere OT-Beiträge werden kommentar- und rechtfertigungslos gelöscht.