Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Apr 19, 2024 18:51

Foren-Übersicht » English » English Programming Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: PChar
BeitragVerfasst: So Mai 22, 2005 18:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 21, 2004 22:39
Beiträge: 360
Wohnort: UK, Scotland
Iv recently been trying to get my engine workign with dlls and come up with a snag. Since DLL's can't be sent stings i have to use PChars. The problem im having is setting the PChars of the entitys. Basicaly each property of the entity is set to the same "space" (a varible called Value) which doesnt' work.

Code:
  1.  
  2. procedure TBSPMap.ProcessEntity(Block : TStringList);
  3. var
  4. i,s,e,s2,e2 : integer;
  5. Name,Value,ValueUC,SS : string;
  6. Angle : Boolean;
  7. begin
  8.  
  9. if not (block.count > 0) then exit;
  10.  
  11. inc(Data.numOfBSPEntitys);
  12. Setlength(Data.Entitys,Data.numOfBSPEntitys);
  13.  
  14. Angle := False;
  15. Data.Entitys[Data.numOfBSPEntitys-1].NewtonIndex  := -1;
  16. Data.Entitys[Data.numOfBSPEntitys-1].Mid          := -1;
  17. Data.Entitys[Data.numOfBSPEntitys-1].TargetId     := -1;
  18. Data.Entitys[Data.numOfBSPEntitys-1].TargetedById := -1;
  19. Data.Entitys[Data.numOfBSPEntitys-1].HintId       := -1;
  20. Data.Entitys[Data.numOfBSPEntitys-1].Model2Id     := -1;
  21. Data.Entitys[Data.numOfBSPEntitys-1].MoveableID   := -1;
  22.  
  23. // Process data and place in Entitys
  24.  
  25. try
  26. for i := 0 to block.Count-1 do
  27. begin
  28.  
  29. s := Pos('"',block.Strings[i]);
  30. e := Pos('"',copy(block.Strings[i],s+1,length(block.Strings[i])));
  31.  
  32. Name := ansilowercase(copy(block.Strings[i],s+1,e-s));
  33.  
  34. SS := copy(block.Strings[i],e+2,length(block.Strings[i]));
  35.  
  36. s2 := Pos('"',SS);
  37.  
  38. e2 := Pos('"',copy(SS,s2+1,length(SS)));
  39.  
  40. ValueUC := copy(SS,s2+1,e2+1-s2);
  41. Value := ansilowercase(ValueUC);
  42.  
  43. if name = 'classname' then
  44. Data.Entitys[Data.numOfBSPEntitys-1].Classname := Value
  45. else
  46. if name = 'target' then
  47. Data.Entitys[Data.numOfBSPEntitys-1].Target := Value
  48. else
  49. if name = 'targetname' then
  50. Data.Entitys[Data.numOfBSPEntitys-1].Targetname := Value
  51. else
  52. if name = 'cursorhint' then
  53. Data.Entitys[Data.numOfBSPEntitys-1].Hint := PChar(Value)
  54. else
  55. if name = 'team' then
  56. Data.Entitys[Data.numOfBSPEntitys-1].Team := Value
  57. else
  58. if (name = 'filename') or(name = 'scriptname') or (name = 'ainame') then
  59. Data.Entitys[Data.numOfBSPEntitys-1].ScriptName := Value
  60. else
  61. if name = 'model' then
  62. begin
  63. Data.Entitys[Data.numOfBSPEntitys-1].model := PChar(Value);
  64. if Copy(Value,1,1) = '*' then
  65. Data.Entitys[Data.numOfBSPEntitys-1].mid := Strtoint(Copy(Value,2,length(Value)))
  66. else
  67. Data.Entitys[Data.numOfBSPEntitys-1].mid := -1;
  68. end
  69. else
  70. if name = 'model2' then
  71. Data.Entitys[Data.numOfBSPEntitys-1].model2 := Value
  72. else
  73. if name = 'origin' then
  74. begin
  75. Data.Entitys[Data.numOfBSPEntitys-1].Origin := ParseEntityVector3f(Value);
  76. Data.Entitys[Data.numOfBSPEntitys-1].OriginUsed := True;
  77. end
  78. else
  79. if name = 'mass' then
  80. Data.Entitys[Data.numOfBSPEntitys-1].mass := StrtoInt(Value)
  81. else
  82. if name = 'spawnflags' then
  83. Data.Entitys[Data.numOfBSPEntitys-1].spawnflags := StrtoInt(Value)
  84. else
  85. if name = 'degrees' then
  86. Data.Entitys[Data.numOfBSPEntitys-1].Degrees := StrtoInt(Value)
  87. else
  88. if name = 'angle' then
  89. Data.Entitys[Data.numOfBSPEntitys-1].Angle := StrtoInt(Value)
  90. else
  91. if name = 'lip' then
  92. Data.Entitys[Data.numOfBSPEntitys-1].Lip := StrtoInt(Value)
  93. else
  94. if name = 'speed' then
  95. Data.Entitys[Data.numOfBSPEntitys-1].Speed := StrtoInt(Value)
  96. else
  97. if name = 'closespeed' then
  98. Data.Entitys[Data.numOfBSPEntitys-1].Closespeed := StrtoInt(Value)
  99. else
  100. if name = 'frames' then
  101. Data.Entitys[Data.numOfBSPEntitys-1].Frames := StrtoInt(Value)
  102. else
  103. if name = 'loop' then
  104. Data.Entitys[Data.numOfBSPEntitys-1].LoopFrame := StrtoInt(Value)
  105. else
  106. if name = 'startonframe' then
  107. Data.Entitys[Data.numOfBSPEntitys-1].StartFrame := StrtoInt(Value)
  108. else
  109. if name = 'wait' then
  110. Data.Entitys[Data.numOfBSPEntitys-1].Wait := StrtoFloat(Value)
  111. else
  112. if name = 'random' then
  113. Data.Entitys[Data.numOfBSPEntitys-1].Random := StrtoFloat(Value)
  114. else
  115. begin
  116. if (name <> '') and (value <> '') then
  117. begin
  118. // Need to add support for unknowns sometime (used in func_multipul)
  119. {inc(Entitys[numOfBSPEntitys-1].Unknown_No);
  120. SetLength(Entitys[numOfBSPEntitys-1].Unknowns,Entitys[numOfBSPEntitys-1].Unknown_No);
  121. Entitys[numOfBSPEntitys-1].Unknowns[Entitys[numOfBSPEntitys-1].Unknown_No-1].Name := Name;
  122. Entitys[numOfBSPEntitys-1].Unknowns[Entitys[numOfBSPEntitys-1].Unknown_No-1].Value := Value;  }
  123. end;
  124. end;
  125. end
  126. except
  127. // Add Error Message Here!
  128. end;
  129.  
  130. end;
  131.  


Note the cursorhint and model sections (only ones that are currently pchars). Im basicaly wondering how i can change this procedure so that each pchar is set to its own space rather than to the same space...

I h8 pchars.

_________________
Free Map Editor - Game Requirements - Stucuk.Net
-Stu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 22, 2005 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
i've just found some sample from www.delphipraxis.net:


Code:
  1. //inside the dll
  2.  
  3.     function TestProc(SourceStr: PChar; var DestStr: PChar): Integer;
  4. begin
  5.   DestStr := StrAlloc(length(SourceStr) + 1);  //speicher für DestStr anfordern
  6.   Move(SourceStr^, DestStr^, length(SourceStr) + 1); //inhalt von SourceStr nach DestStr kopieren
  7.   //fals es keine binärdaten sind dann die abschließende #0 (Stringende) - if it is no binary data, append the trailing #0
  8.   DestStr[length(SourceStr)] := #0; //bei DestStr noch ein #0 anhängen - one more #0 for deststr
  9.   //falls es doch binärdaten sind ist es besser die Länge zurück zu geben - if it is binary data, better return the length
  10.   result := length(SourceStr);
  11. end;
  12.  
  13. procedure FreeMemFromTestProc(AChars: PChar);
  14. begin
  15.   StrDispose(AChars);
  16. end;
  17.  
  18.  
  19. //inside the main app
  20. Quellcode:  markieren
  21. procedure TForm1.FormCreate(Sender: TObject);
  22. var LDestStr: PChar;
  23. begin
  24.   TestProc('abcdef', LDestStr);
  25.   //do something with LDestStr
  26.   FreeMemFromTestProc(LDestStr);
  27. end;


maybe this can help you.

but why don't the tags work?!

Code:
  1. test

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 23, 2005 00:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 21, 2004 22:39
Beiträge: 360
Wohnort: UK, Scotland
Ahh that should work thx!

P.S i noticed the pascal tag didn't work too.... code one still works tho

_________________
Free Map Editor - Game Requirements - Stucuk.Net
-Stu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 23, 2005 04:41 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
You can also use FastShareMem http://www.codexterity.com/fastsharemem.htm. Just use this unit as the first unit in your dpr file and then you can use normal strings.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 23, 2005 14:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 21, 2004 22:39
Beiträge: 360
Wohnort: UK, Scotland
Id prefer to have pchars since the dll could be converted to C, etc. Tho thx for the sugestion.

_________________
Free Map Editor - Game Requirements - Stucuk.Net
-Stu


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » English » English Programming Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.140s | 17 Queries | GZIP : On ]