Autor Beitrag
Exciter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:

ausblenden 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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 19.03.06 16:06 
user profile iconChristian 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: So 19.03.06 16:22 
user profile iconExciter hat folgendes geschrieben:
user profile iconChristian 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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++
BeitragVerfasst: So 19.03.06 16:42 
wenn es nur im zahlen geht die eine stelle haben nehm:
ausblenden 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...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if wert in [#48..#57then
 begin
 inc(wert);
 s:=s+chr(wert);
 end;


ansonsten der befehl
ausblenden Delphi-Quelltext
1:
insert(...);					

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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 19.03.06 16:42 
user profile iconExciter 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 221

Windows XP Home
Delphi 7 PE, Delphi 2005 PE
BeitragVerfasst: 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:

ausblenden 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:

ausblenden Delphi-Quelltext
1:
  str[5]:=Char(Ord(str[5])+1);					

oder ganz kurz:

ausblenden Delphi-Quelltext
1:
  Inc(str[5]);					


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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 19.03.06 23:03 
user profile iconChristian S. hat folgendes geschrieben:
user profile iconExciter 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...

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 19.03.06 23:16 
Dann ist ja gut. Entschuldige, dass ich ein wenig unhöflich war. :beer:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Grishnak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 221

Windows XP Home
Delphi 7 PE, Delphi 2005 PE
BeitragVerfasst: So 19.03.06 23:54 
ähem, wenn du eh nur ein Zeichen ändern willst, würde auch ein
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Mo 20.03.06 10:56 
Hallo!

Ich benutze für Dein Problem, Integer in einen String direkt einzubauen einfach folgendes Packed-Record:

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 150



BeitragVerfasst: 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