[Delphi] Mustersuche in dateien

Daradon

Cadet 1st Year
Registriert
Mai 2004
Beiträge
15
Hi ,

Also ich hab da ein ziehmliches problem ,... ich hab eine ca 200 zeilen lange datei die ca so aufgebaut ist:

Code:
[46] 
{ 
gold_value = 200; 
grid_x = 703; 
grid_y = 318; 
inv_location = il_main; 
modifier_prefix_name = ofthezapped; 
modifier_suffix_name = ofglaciers; 
template_name = potion_health_super; 
} 
[47] 
{ 
gold_value = 200; 
grid_x = 671; 
grid_y = 350; 
inv_location = il_main; 
modifier_prefix_name = ofthezapped; 
modifier_suffix_name = ofglaciers; 
template_name = potion_health_super; 
} 
[48] 
{ 
equip_slot = es_spellbook; 
gold_value = 5; 
inv_location = il_main; 
modifier_prefix_name = unwavering; 
modifier_suffix_name = unwavering; 
template_name = book_glb_magic_17; 
[spellbook] 
{ 
grid_x_offset = 0; 
grid_y_offset = 0; 
pack_only = false; 
selected_active_location = il_spell_1; 
[inventory] 
{ 
[0] 
{ 
gold_value = 61235; 
inv_location = il_spell_12; 
modifier_prefix_name = ofemphasis; 
modifier_suffix_name = ofcertainty; 
template_name = spell_maljin_ball_03; 
}

nun ich möchte das ich einzellne sachen in ein dropdown menü laden kann
soll ca so aussehen das ich ein drop down haben mit [ portion_health_supper #nr ] und daneben hab ich 2 editfelder für jeweils modifier_suffix_name und modifier_prefix_name ,... wenn ich nun z.b portion_health_supper #47 auswähle sollte im editfeld dann suffix/prefix von dem da stehen ( wie das geht weiß ich .. keine sorge :) )

aber wie ich aus dieser textdatei die informationen der einzellenen "items" auslesen kann weiß ich nicht ...

cya Daradon

€dit:
ich dachte daran das alle blöcke (die meistens genau 8 zeilen sind) in eine temporäre datei schreibe und dann direkt per zeile und zeichen zugreife .. aber hab das noch nicht getestet .. vielleicht weiß von euch wer eine bessere idee
 
Zuletzt bearbeitet:
Hi,

schreibe deine Daten doch einfach in eine INI-Datei und nutze zum Auslesen die Klasse TIniFile. Dazu musst du Die Unit "inifiles" einbinden. Dann kannst du mit Readstring deine Werte auslesen. Schaue einfach in die Hilfe.

Hoffe ich konnte dir ein wenig helfen.

André
 
Du bastelst dir eine Klasse oder auch ein Record welches immer genau diese 8 Zeilen aufnimmt und schreibst dir einen Parser für diese Textdatei, der die einfach durchgeht und entsprechend viele Klassen/Record Instanzen erzeugt und mit Datenfüllt (einfach sequenziell zeile für zeile).

Dann kannst du die Datei komplett leermachen und auf Basis der Instanzen wieder aufbauen.

Schnell, sauber und wenig Aufwand.

PS: Wenn du nähere Hilfe brauchst, schreib mir ne PN....
 
@MagicAndre:
TIniFile würde höchstens zum Lesen gehen. Beim Schreiben würden die geschweiften Klammern vor und nach jedem Block 'wegoptimiert' werden. Ich könnte mir ne Lösung aus zwei Klassen vorstellen, die jeweils eine TStringList besitzen und die Eigenschaften entsprechend parsen und auch wieder schreiben können.
 
BOZ_er schrieb:
Du bastelst dir eine Klasse oder auch ein Record welches immer genau diese 8 Zeilen aufnimmt und schreibst dir einen Parser für diese Textdatei, der die einfach durchgeht und entsprechend viele Klassen/Record Instanzen erzeugt und mit Datenfüllt (einfach sequenziell zeile für zeile).

Dann kannst du die Datei komplett leermachen und auf Basis der Instanzen wieder aufbauen.

Schnell, sauber und wenig Aufwand.

PS: Wenn du nähere Hilfe brauchst, schreib mir ne PN....

das problem ist das es nicht immer 8 zeilen sind .. manchmal 10 .. manchmal 3 ..
ich schreib mal so eine ganze dummy datei:

Code:
[party]
{
	[members]
	{
		[0]
		{
			[member]
			{
				actor_class = "Großmeister";
				combat_orders = co_free;
				custom_head = default;
				disposition_orders = ad_defensive;
				focus_orders = fo_closest;
				gold = 13317415;
				grid_x_offset = 233;
				grid_y_offset = 30;
				m_clientcachedengagedobject = 0x00000000;
				movement_orders = mo_free;
				pack_only = false;
				screen_name = "daradon";
				selected_active_location = il_active_melee_weapon;
				template_name = farmboy;
				[inventory]
				{
					[0]
					{
						gold_value = 240277;
						grid_x = 233;
						grid_y = 318;
						inv_location = il_main;
						modifier_prefix_name = ofattainment;
						modifier_suffix_name = ofattainment;
						template_name = bw_un_seck_fin;
					}
					[1]
					{
						gold_value = 1000870;
						grid_x = 265;
						grid_y = 350;
						inv_location = il_main;
						modifier_prefix_name = ofwinter;
						modifier_suffix_name = ofwinter;
						template_name = ring_common;
					}
					[10]
					{
						gold_value = 26017;
						grid_x = 265;
						grid_y = 254;
						inv_location = il_main;
						modifier_suffix_name = ofthespry;
						template_name = amulet_common;
						variation_name = s_d_mag;
					}
					[11]
					{
						gold_value = 432609;
						grid_x = 393;
						grid_y = 190;
						inv_location = il_main;
						template_name = spell_mystic_aid;
					}
					[12]
					{
						gold_value = 243162;
						grid_x = 457;
						grid_y = 62;
						inv_location = il_main;
						modifier_prefix_name = reliant;
						template_name = book_glb_magic_19;
						[spellbook]
						{
							grid_x_offset = 0;
							grid_y_offset = 0;
							pack_only = false;
							selected_active_location = il_spell_2;
							[inventory]
							{
								[0]
								{
									gold_value = 79482;
									inv_location = il_spell_7;
									template_name = spell_flame_blades;
								}
								[1]
								{
									gold_value = 79528;
									inv_location = il_spell_8;
									template_name = spell_firerain;
								}
								[10]
								{
									gold_value = 300555;
									inv_location = il_spell_10;
									template_name = spell_firebomb;
								}
								[2]
								{
									gold_value = 65;
									inv_location = il_spell_6;
									template_name = spell_summon_gargoyle;
								}
								[3]
								{
									gold_value = 330529;
									inv_location = il_spell_12;
									template_name = spell_pillar_fire;
								}
								[4]
								{
									gold_value = 67591;
									inv_location = il_spell_3;
									template_name = spell_invincibility;
								}
								[5]
								{
									gold_value = 241851;
									inv_location = il_spell_5;
									template_name = spell_meteor;
								}
								[6]
								{
									gold_value = 289493;
									inv_location = il_spell_4;
									template_name = spell_summon_impaler;
								}
								[7]
								{
									gold_value = 226771;
									inv_location = il_spell_9;
									template_name = spell_meriks_windfall;
								}
								[8]
								{
									gold_value = 3684;
									inv_location = il_spell_11;
									template_name = spell_fireball;
								}
								[9]
								{
									gold_value = 710444;
									inv_location = il_spell_1;
									template_name = spell_lightning_storm;
								}
							}
						}
					}
					[13]
					{
						gold_value = 1878;
						grid_x = 233;
						grid_y = 254;
						inv_location = il_main;
						modifier_suffix_name = warring;
						template_name = ring_common;
					}
					[14]
					{
						grid_x = 457;
						grid_y = 30;
						inv_location = il_main;
						template_name = stone_glb_crystwind_01;
					}
					[15]
					{
						equip_slot = es_amulet;
						gold_value = 34397;
						inv_location = il_main;
						modifier_suffix_name = ofthelion;
						template_name = amulet_common;
						variation_name = b_c_avg;
					}
					[16]
					{
						gold_value = 300211;
						grid_x = 329;
						grid_y = 222;
						inv_location = il_main;
						template_name = spell_nova_strike;
					}
					[17]
					{
						gold_value = 78625;
						grid_x = 393;
						grid_y = 158;
						inv_location = il_main;
						template_name = spell_frigid_armor;
					}
					[18]
					{
						gold_value = 45;
						grid_x = 265;
						grid_y = 222;
						inv_location = il_main;
						template_name = spell_freak;
					}
					[19]
					{
						gold_value = 101940;
						grid_x = 425;
						grid_y = 158;
						inv_location = il_main;
						template_name = minigun_flamethrower;
					}
					[2]
					{
						gold_value = 1878;
						grid_x = 393;
						grid_y = 286;
						inv_location = il_main;
						modifier_prefix_name = ofomniscience;
						modifier_suffix_name = ofomniscience;
						template_name = ring_common;
					}
					[20]
					{
						gold_value = 289493;
						grid_x = 425;
						grid_y = 62;
						inv_location = il_main;
						template_name = spell_summon_impaler;
					}
					[21]
					{
						gold_value = 84987;
						grid_x = 233;
						grid_y = 222;
						inv_location = il_main;
						template_name = spell_summon_wraith;
					}
					[22]
					{
						gold_value = 300555;
						grid_x = 425;
						grid_y = 30;
						inv_location = il_main;
						template_name = spell_firebomb;
					}
					[23]
					{
						gold_value = 502933;
						grid_x = 297;
						grid_y = 190;
						inv_location = il_main;
						modifier_prefix_name = harsh;
						template_name = book_glb_magic_20;
						[spellbook]
						{
							grid_x_offset = 0;
							grid_y_offset = 0;
							pack_only = false;
							selected_active_location = il_spell_2;
							[inventory]
							{
								[0]
								{
									gold_value = 20;
									inv_location = il_spell_2;
									template_name = spell_leech_life;
								}
								[1]
								{
									gold_value = 49245;
									inv_location = il_spell_6;
									template_name = spell_shock_wave;
								}
								[10]
								{
									gold_value = 139;
									inv_location = il_spell_4;
									template_name = spell_soul_lance;
								}
								[11]
								{
									gold_value = 11288;
									inv_location = il_spell_12;
									template_name = spell_summon_skick;
								}
								[2]
								{
									gold_value = 26994;
									inv_location = il_spell_9;
									template_name = spell_lightning_blast;
								}
								[3]
								{
									gold_value = 14629;
									inv_location = il_spell_8;
									template_name = spell_spark_multi;
								}
								[4]
								{
									gold_value = 19357;
									inv_location = il_spell_7;
									template_name = spell_fire_wall;
								}
								[5]
								{
									gold_value = 76157;
									inv_location = il_spell_1;
									template_name = spell_light_ray;
								}
								[6]
								{
									gold_value = 604;
									inv_location = il_spell_10;
									template_name = spell_iceshard;
								}
								[7]
								{
									gold_value = 36251;
									inv_location = il_spell_5;
									template_name = spell_shargs_revive;
								}
								[8]
								{
									gold_value = 197;
									inv_location = il_spell_11;
									template_name = spell_shock;
								}
								[9]
								{
									gold_value = 115874;
									inv_location = il_spell_3;
									template_name = spell_inferno;
								}
							}
						}
					}
					[24]
					{
						gold_value = 1000;
						grid_x = 393;
						grid_y = 94;
						inv_location = il_main;
						template_name = fury_eye;
					}
					[25]
					{
						gold_value = 260;
						grid_x = 265;
						grid_y = 190;
						inv_location = il_main;
						template_name = potion_rejuvenation_super;
					}
					[26]
					{
						gold_value = 260;
						grid_x = 233;
						grid_y = 190;
						inv_location = il_main;
						template_name = potion_rejuvenation_super;
					}
					[27]
					{
						gold_value = 126405;
						grid_x = 361;
						grid_y = 126;
						inv_location = il_main;
						modifier_suffix_name = ofthejolted;
						template_name = sd_g_c_st_2h_avg;
						variation_name = o_mag;
					}
					[28]
					{
						gold_value = 5052;
						grid_x = 425;
						grid_y = 254;
						inv_location = il_main;
						modifier_suffix_name = ofcolossus;
						template_name = ring_common;
					}
					[29]
					{
						gold_value = 5052;
						grid_x = 361;
						grid_y = 286;
						inv_location = il_main;
						modifier_suffix_name = ofcolossus;
						template_name = ring_common;
					}
					[3]
					{
						equip_slot = es_ring_3;
						gold_value = 5052;
						inv_location = il_main;
						modifier_prefix_name = ofcolossus;
						modifier_suffix_name = ofcolossus;
						template_name = ring_common;
					}
					[30]
					{
						gold_value = 5052;
						grid_x = 265;
						grid_y = 286;
						inv_location = il_main;
						modifier_suffix_name = ofcolossus;
						template_name = ring_common;
					}
					[31]
					{
						gold_value = 3934;
						grid_x = 393;
						grid_y = 30;
						inv_location = il_main;
						modifier_suffix_name = ofthelion;
						template_name = book_glb_magic_10;
					}
					[32]
					{
						gold_value = 200;
						grid_x = 297;
						grid_y = 158;
						inv_location = il_main;
						template_name = potion_health_super;
					}
					[33]
					{
						equip_slot = es_spellbook;
						gold_value = 5;
						inv_location = il_main;
						template_name = book_glb_magic_01;
						[spellbook]
						{
							grid_x_offset = 0;
							grid_y_offset = 0;
							pack_only = false;
							selected_active_location = il_spell_2;
							[inventory]
							{
								[0]
								{
									gold_value = 44231;
									inv_location = il_spell_1;
									template_name = spell_clean_strike;
								}
								[1]
								{
									gold_value = 5302;
									inv_location = il_spell_2;
									template_name = spell_triple_strike;
								}
								[10]
								{
									gold_value = 7523;
									inv_location = il_spell_5;
									template_name = spell_reconstitution;
								}
								[2]
								{
									gold_value = 30128;
									inv_location = il_spell_6;
									template_name = spell_pain_reflux;
								}
								[3]
								{
									gold_value = 890;
									inv_location = il_spell_8;
									template_name = spell_ogres_might;
								}
								[4]
								{
									gold_value = 254;
									inv_location = il_spell_9;
									template_name = spell_healing_wind;
								}
								[5]
								{
									gold_value = 1693;
									inv_location = il_spell_4;
									template_name = spell_mana_shield;
								}
								[6]
								{
									gold_value = 36251;
									inv_location = il_spell_11;
									template_name = spell_shargs_revive;
								}
								[7]
								{
									gold_value = 18003;
									inv_location = il_spell_3;
									template_name = spell_shock_armor;
								}
								[8]
								{
									gold_value = 13946;
									inv_location = il_spell_7;
									template_name = spell_flame_shield;
								}
								[9]
								{
									gold_value = 10;
									inv_location = il_spell_10;
									template_name = spell_healing_hands;
								}
							}
						}
					}
					[34]
					{
						gold_value = 363874;
						grid_x = 361;
						grid_y = 94;
						inv_location = il_main;
						template_name = spell_harmony;
					}
					[35]
					{
						gold_value = 1723;
						grid_x = 265;
						grid_y = 158;
						inv_location = il_main;
						template_name = spell_fireskull;
					}
					[36]
					{
						gold_value = 260;
						grid_x = 361;
						grid_y = 62;
						inv_location = il_main;
						template_name = potion_mana_super;
					}
					[37]
					{
						gold_value = 260;
						grid_x = 233;
						grid_y = 158;
						inv_location = il_main;
						template_name = potion_mana_super;
					}
					[38]
					{
						gold_value = 350123;
						grid_x = 361;
						grid_y = 30;
						inv_location = il_main;
						template_name = spell_malign;
					}
					[39]
					{
						gold_value = 19;
						grid_x = 297;
						grid_y = 126;
						inv_location = il_main;
						template_name = spell_transmute;
					}
					[4]
					{
						equip_slot = es_ring_2;
						gold_value = 1000870;
						inv_location = il_main;
						modifier_prefix_name = ofice;
						modifier_suffix_name = ofice;
						template_name = ring_common;
					}
					[40]
					{
						gold_value = 500553;
						grid_x = 329;
						grid_y = 94;
						inv_location = il_main;
						modifier_prefix_name = immense;
						template_name = sd_ra_g_o_st_2h_avg;
						variation_name = o_str;
					}
					[41]
					{
						gold_value = 50;
						grid_x = 265;
						grid_y = 126;
						inv_location = il_main;
						template_name = scroll_mana_channel;
					}
					[42]
					{
						gold_value = 200;
						grid_x = 329;
						grid_y = 62;
						inv_location = il_main;
						template_name = potion_health_super;
					}
					[43]
					{
						gold_value = 200;
						grid_x = 233;
						grid_y = 126;
						inv_location = il_main;
						template_name = potion_health_super;
					}
					[44]
					{
						gold_value = 71;
						grid_x = 329;
						grid_y = 30;
						inv_location = il_main;
						template_name = spell_revive;
					}
					[45]
					{
						equip_slot = es_head;
						gold_value = 95889;
						inv_location = il_main;
						modifier_prefix_name = vengeful;
						modifier_suffix_name = ofhardiness;
						template_name = he_fu_pl_horn_mag_02;
					}
					[46]
					{
						gold_value = 200;
						grid_x = 265;
						grid_y = 94;
						inv_location = il_main;
						template_name = potion_health_super;
					}
					[47]
					{
						gold_value = 1;
						grid_x = 297;
						grid_y = 62;
						inv_location = il_main;
						template_name = book_glb_lore_riddle;
					}
					[48]
					{
						gold_value = 260;
						grid_x = 233;
						grid_y = 94;
						inv_location = il_main;
						template_name = potion_mana_super;
					}
					[49]
					{
						equip_slot = es_feet;
						gold_value = 88465;
						inv_location = il_main;
						modifier_prefix_name = driving;
						modifier_suffix_name = ofthedog;
						template_name = bo_gr_fp_f_g_c_avg;
						variation_name = c_str;
					}
					[5]
					{
						gold_value = 1000870;
						grid_x = 393;
						grid_y = 222;
						inv_location = il_main;
						modifier_prefix_name = ofwinter;
						modifier_suffix_name = ofice;
						template_name = ring_common;
					}
					[50]
					{
						gold_value = 512397;
						grid_x = 297;
						grid_y = 30;
						inv_location = il_main;
						template_name = spell_lightning_bolt;
					}
					[51]
					{
						gold_value = 242157;
						grid_x = 233;
						grid_y = 62;
						inv_location = il_main;
						template_name = spell_sun_ray;
					}
					[52]
					{
						gold_value = 1;
						grid_x = 265;
						grid_y = 30;
						inv_location = il_main;
						template_name = book_glb_lore_riddle;
					}
					[53]
					{
						gold_value = 11671;
						grid_x = 233;
						grid_y = 30;
						inv_location = il_main;
						template_name = spell_summon_cave_giant;
					}
					[54]
					{
						gold_value = 5052;
						grid_x = 393;
						grid_y = 254;
						inv_location = il_main;
						modifier_suffix_name = ofcolossus;
						template_name = ring_common;
					}
					[55]
					{
						equip_slot = es_chest;
						gold_value = 467806;
						inv_location = il_main;
						modifier_prefix_name = terrestrial;
						modifier_suffix_name = ofinsight;
						template_name = bd_fp_f_g_c_avg;
						variation_name = o_str;
					}
					[56]
					{
						equip_slot = es_forearms;
						gold_value = 2048;
						inv_location = il_main;
						modifier_suffix_name = oftheserpent;
						template_name = gl_gl_br_f_g_c_avg;
						variation_name = o_avg;
					}
					[6]
					{
						equip_slot = es_ring_0;
						gold_value = 581749682;
						inv_location = il_main;
						modifier_prefix_name = ofthelion;
						modifier_suffix_name = ofcolossus;
						template_name = ring_common;
					}
					[7]
					{
						gold_value = 1000870;
						grid_x = 233;
						grid_y = 286;
						inv_location = il_main;
						modifier_prefix_name = ofice;
						modifier_suffix_name = ofwinter;
						template_name = ring_common;
					}
					[8]
					{
						equip_slot = es_weapon_hand;
						gold_value = 1218517;
						inv_location = il_active_melee_weapon;
						modifier_prefix_name = outlandish;
						modifier_suffix_name = ofrevenge;
						template_name = hm_ra_g_c_2h1m_fin;
						variation_name = c_mag;
					}
					[9]
					{
						gold_value = 207365;
						grid_x = 297;
						grid_y = 254;
						inv_location = il_main;
						modifier_prefix_name = optimistic;
						modifier_suffix_name = ofprosperity;
						template_name = sh_ra_w_g_o_t_l_avg;
						variation_name = c_mag;
					}
				}

das einzige was hier wirklich immer sind sind die klammern .. nur die sind meistens verschachtelt und deswegen kann ich auch nicht so einfach alle {} rausschneiden ;(


€dit:

was mir gerade eingefallen ist ...
ich könnte doch die eingelesenen datein so speichern

Code:
var Inventar : Record
                     var Traenke : Record
                            suffix,
                            prefix: byte;
                            template : String;
                      end;

                     var equipt : Record
                            suffix
                            prefix: byte;
                            template : String;
                     end;

                     var spellbook : Record
                          il_spell_0,
                          il_spell_1,
                          il_spell_2,
                          il_spell_3,
                          il_spell_4,
                          il_spell_5,
                          il_spell_6,
                          il_spell_7,
                          il_spell_8,
                          il_spell_9,
                          il_spell_10,
                          il_spell_11,
                          suffix,
                          prefix : byte;
                          template : String;

usw ....

nur jetzt hab ich ein paar probleme,.. ich habe mehrere "tränke" , " spellbooks" und "spells" in meinem inventar .. was mir gerade auffält ich müsse einen weiteren record für die spells machen, aber auf jeden fall weiß ich jetzt 2 dinge nicht mehr genau:

ist es überhaupt möglich records so zu schachteln,
und kann ich in dem größen record(Inventar) mehrere kleine (tränke) records verwenden?
z.b Inventar.treanke.1 ,Inventar.treanke.2,.. Inventar.treanke.n ?
 
Zuletzt bearbeitet:
Ja na klar kannst du Records belibig schachteln - allerding mit einer großen Einschränkung (weswegen ich auch eigendlich IMMER zu einer Klasse rate) man kann diese Records nciht dynamisch schachteln. Soll heißen, daß dynamische Arrays in Records nicht möglich sind (zumindest in Delphi 6 (was anderes habe ich hier nicht)).


Das Parsen is doch easy:

da du immer feste strings (also bla = wert) dH nach jedem "{" testest du ob die nächste zeile mit einem deiner vordefinierten strings beginnt (die schreibst du vorher in eine Liste(ein set of string wäre da verdammt schnuckelig) ) und warst die zeilen solange bis wieder ein "}" kommt.

Diese {} sind deine Freunde - die darfst du nicht wegschneiden :D
 
ich geh mir mal ein delphi buch kaufen lol ... is einfach zu lang her .. dachte das geht gerade noch .. hab mit delphi 2 (wo es rausgekommen ist) ein 3/4 jahr gearbeitet .. und jetzt .. meiste wissen weg :(
 
Ich habe hier auch mehrere dicke Bücher stehen - ich kann dir von Hanser "Borland Delphi 6(7) - Drundlagen und Profiwissen" empfehlen (sonn rotes Buch mit weißer Schrift , ~1200Seiten) aber die bringen auch nur bedingt was....

wenn du mal eine konkrete Umsetzung brauchst, dann melde dich per PN ich kann dir das dann mal am praktischen Bsp. zeigen.


Delphi 2 hatte noch nichts mit dem heutigen Delphi zu tun :) Das war wirklich nur Pascal für Windows....
 
Zurück
Oben