Autor |
Beitrag |
Exciter
Hält's aus hier
Beiträge: 3
|
Verfasst: So 19.03.06 15:24
Hallo,
Ich hab folgendes Problem: ich schreibe als Projektarbeit einen Midi-Sequencer. Soweit so gut, mit dem allgemeinen drumherum bin ich fertig.
Nun wollte ich eine Möglichkeit einbauen, die aufgenommenen Töne eine Oktave nach oben oder unten zu transponieren. In meinem Recordarray ist das kein Problem, jedoch werden die Töne des aufgenommenen Musikstücks in einer MemoBox angezeigt, und zwar wie folgt: Ein C mit der Länge einer Viertelnote in der 3. Oktave wird als 4-C-3; in die MemoBox geschrieben. Meine Prozedur sucht die Zahl vor dem Strichpunkt, formt sie in einen Integerwert um und erhöht sie um 1. Will ich sie jetzt wieder in den String einfügen, hab ich das Problem, dass Integer und Char nicht kompatibel sind.
Zum besseren Verständis hier der Quelltext:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Aufnahme1Oktave1Click(Sender: TObject); var aufnahmestring: string; i, buffer: integer; begin aufnahmestring:=memo1.lines.Text; for i:=length(aufnahmestring) downto 1 do begin if aufnahmestring[i]=';' then begin buffer:=strtoint(aufnahmestring[i-1]); inc(buffer); aufnahmestring[i-1]:=chr(buffer); end; end; memo1.lines.text:=aufnahmestring; end; |
Wenn ich nach der Methode vorgehe, kriege ich nur lustige Ascii-Zeichen. Aber was andere fällt mir nicht ein, den Integerwert in den String einzufügen. Mit StringReplace kann ich das nicht machen, weil die Oktaven immer zwischen 0-9 variieren und dann auch Tonlängen gelöscht werden, die mit den Oktavwerten identisch sind.
Help!
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 19.03.06 15:38
Hallo!
Zur Umwandlung von ganzen Zahlen in Zeichen (Strings) verwendest Du die Funktion IntToStr.
Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Exciter 
Hält's aus hier
Beiträge: 3
|
Verfasst: So 19.03.06 16:06
Christian S. hat folgendes geschrieben: | Hallo!
Zur Umwandlung von ganzen Zahlen in Zeichen (Strings) verwendest Du die Funktion IntToStr.
Grüße
Christian |
Ähm ja, das ist klar. Nur geht es hier darum, dass man Strings nicht per String[i]:=string einfügen kann. Da muss ein Char-Wert hin, und ich will wissen wie man Integer zu Char umformt. Hab auch nix dazu im I-Net gefunde.
|
|
Born-to-Frag
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: So 19.03.06 16:22
Exciter hat folgendes geschrieben: | Christian S. hat folgendes geschrieben: | Hallo!
Zur Umwandlung von ganzen Zahlen in Zeichen (Strings) verwendest Du die Funktion IntToStr.
Grüße
Christian |
Ähm ja, das ist klar. Nur geht es hier darum, dass man Strings nicht per String[i]:=string einfügen kann. Da muss ein Char-Wert hin, und ich will wissen wie man Integer zu Char umformt. Hab auch nix dazu im I-Net gefunde. |
Das geht wohl nur für Integer-Werte < 256.. dann mit Chr(Integer) ... aber ich glaube eher du willst einen Integer so in einen String bringen:
'abcdefghij' in 'abcde45456fghij'
Wenn ja dann seh dir mal Copy() an, das wird dir vielleicht weiterhelfen
greetz
EDIT: Nur zahlen von 0-9? Dann mach doch deinstring[i-1] := IntToStr(Buffer)[1];
_________________ Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
|
|
starsurfer
      
Beiträge: 334
Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
|
Verfasst: So 19.03.06 16:42
wenn es nur im zahlen geht die eine stelle haben nehm:
Delphi-Quelltext 1: 2: 3:
| var wert:byte;
wert:=ord(char); |
dann guggst du ob die in der ASCII Tabelle zw. 48..57 liegen...
wenn ja nimmste den wert erhöhst den um 1ns und wandelst ihn wieder in char um... Delphi-Quelltext 1: 2: 3: 4: 5:
| if wert in [#48..#57] then begin inc(wert); s:=s+chr(wert); end; |
ansonsten der befehl
Delphi-Quelltext
kann auch helfen...
_________________ GEIZ IST GEIL! - Ihr Sozialamt
Zuletzt bearbeitet von starsurfer am So 19.03.06 16:45, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 19.03.06 16:42
Exciter hat folgendes geschrieben: | Da muss ein Char-Wert hin, und ich will wissen wie man Integer zu Char umformt. Hab auch nix dazu im I-Net gefunde. |
Sorry, aber wo ist das Problem? Du wandelst die Zahl in einen String um und nimmst das erste Zeichen davon.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: So 19.03.06 16:43
Wenn sich nur eine Ziffer im String ändert, würde auch für dein Beispiel '4-C-3' auch folgendes funktionieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var str: string; oktave: integer; [...] str:='4-C-3'; oktave:=Ord(str[5])-Ord('0'); Inc(oktave); oktave:=oktave+Ord('0'); str[5]:=Char(oktave); |
oder kürzer:
Delphi-Quelltext 1:
| str[5]:=Char(Ord(str[5])+1); |
oder ganz kurz:
Delphi-Quelltext
alle drei Versionen funktionieren aber nur von 0 bis 8, was dann 1 bis 9 ergeben würde!
_________________ Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
Exciter 
Hält's aus hier
Beiträge: 3
|
Verfasst: So 19.03.06 23:03
Christian S. hat folgendes geschrieben: | Exciter hat folgendes geschrieben: | Da muss ein Char-Wert hin, und ich will wissen wie man Integer zu Char umformt. Hab auch nix dazu im I-Net gefunde. | Sorry, aber wo ist das Problem? Du wandelst die Zahl in einen String um und nimmst das erste Zeichen davon. |
Mein Problem ist, dass ich mit ner IntToStr-Funktion die man mir einfach nur so hinwirft nicht viel anfangen kann. Aber jetzt wo du sagst, dass ich nur das erste Zeichen nehmen muss krieg ich die Erleuchtung. Eigentlich ziemlich simpel. Nur das erste Zeichen nehmen...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Aufnahme1Oktave1Click(Sender: TObject); var aufnahmestring: string; i, buffer: integer; begin aufnahmestring:=memo1.lines.Text; for i:=length(aufnahmestring) downto 1 do begin if aufnahmestring[i]=';' then begin buffer:=strtoint(aufnahmestring[i-1]); inc(buffer); aufnahmestring[i-1]:=inttostr(buffer)[1]; end; end; memo1.lines.text:=aufnahmestring; end; |
Also, IntToStr(buffer)[1] war die einfache Lösung des Problems. Funzt einwandfrei, es werden nur die Oktavwerte ersetzt. Danke für eure Antworten und @Christian S. für die Erleuchtung
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 19.03.06 23:16
Dann ist ja gut. Entschuldige, dass ich ein wenig unhöflich war. 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: So 19.03.06 23:54
ähem, wenn du eh nur ein Zeichen ändern willst, würde auch ein
Delphi-Quelltext 1:
| Inc(aufnahmestring[i-1]); |
reichen! Wäre auch wesentlich schneller, als das Umwandeln in einen String und zurück.
_________________ Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
Logikmensch
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: Mo 20.03.06 10:56
Hallo!
Ich benutze für Dein Problem, Integer in einen String direkt einzubauen einfach folgendes Packed-Record:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type inttochar=packed record case integer of 0:(i:integer); 1:(a:array[1..sizeof(integer)] of char); end; |
Nun kannst Du z.B. einen Integer DAUER einfach in den String einbauen mit
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var i:inttochar; begin i.i:=dauer; s:=s+' dies ist ein Test für die Dauer: '+i.a; ... end; |
Viel Erfolg!
|
|
0xCC
      
Beiträge: 150
|
Verfasst: Fr 24.03.06 18:37
und was bringt dir das logikmensch ?
es werden die bytes des integers direkt an den string angehängt, nicht aber der zahlenwert im ascii-bereich
|
|