Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2019, 09:15   #1
TheKwon
 
Регистрация: 09.06.2019
Сообщений: 4
По умолчанию Из одного ItemIndex ComboBox-са разбросать значения в несколько Edit-ов

Здравствуйте, многоуважаемые мастера программирования.
Прошу помочь очень начинающему.
Пожалуйста, помогите решить две проблемы:

1. Есть ComboBox в который загружается текстовый файл звуковой разметки для файла звука.
Вид текста такой:
<t id="1" s="0" l="1329"/>
<t id="2" s="2329" l="2061"/>
<t id="3" s="5390" l="1605"/>
<t id="4" s="7995" l="1126"/>
....
где
s="7995" - время в миллисекундах от начала файла
l="1126" - время в миллисекундах продолжительности звучания выбранного отрезка

Вопрос - как заставить событие ComboBoxChange разбрасывать значения
s="...." в Edit1 и l="...." в Edit2 ?
Т.е. автоматически заполнить эдиты (только цифрами) из выбранной комбобоксом строки
значениями с определенными метками в текстовом файле - S="(Edit1.Text)" L="(Edit2.Text)".

Советуют использовать:
https://regex.sorokin.engineer/ru/latest/
https://regexpstudio.com/ru/regexp_syntax.html
но, какой конкретно должен быть код, это не в моих возможностях.

Второй вопрос.

2. Создать кнопку сохранения выбранного участка звука в WAV-файл.

Приблизительно это может выглядеть так:

Код:
procedure TFormPlayer.CreateWavClick(Sender: TObject);
var
  FragmentStart, FragmentEnd: LongInt;
  WaveStream: TMemoryStream;
  FS: TFileStream;
  SoundTrack: array of Integer;
begin
  if FileExists('00144.mp3') then
  begin
    FragmentStart := StrToInt(EditStart.Text);
    FragmentEnd := FragmentStart + StrToInt(EditEnd.Text);
    MediaPlayer1.FileName := '00144.mp3';
    MediaPlayer1.Open;
    MediaPlayer1.TimeFormat := tfMilliseconds;
    MediaPlayer1.StartPos := FragmentStart;
    MediaPlayer1.EndPos := FragmentEnd;
    MediaPlayer1.Wait := False;
    {WaveStream.SaveToFile('Sound.wav');
    WaveStream.Free;}
   try
    FS := TFileStream.Create('FileName.wav', fmCreate or fmOpenWrite);
    FS.Write(SoundTrack[0], SizeOf(Integer) * Length(SoundTrack));
   finally
     FS.Free;
     Finalize(SoundTrack);
   end;
  end;
end;
Но, создается файл с нулевым объемом.

Сама программа:
https://drive.google.com/file/d/1kPH...ew?usp=sharing

Помогите, пожалуйста, если не сложно.
Прошу прощения за свою малограмотность в программировании.

С Уважением, TheKwon.

Последний раз редактировалось TheKwon; 09.06.2019 в 16:25.
TheKwon вне форума Ответить с цитированием
Старый 10.06.2019, 09:45   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

1.
Цитата:
Вопрос - как заставить событие ComboBoxChange разбрасывать значения
s="...." в Edit1 и l="...." в Edit2 ?
Код:
r:=TStringList.Create;
r.Delimiter:=' ';

r.delimiterText:=Combobox.Text; //  :=ComboBox.Items[Combobox.ItemIndex];
Edit1.Text:=r.Values['s'];
Edit2.Text:=r.Values['l'];

r.Free;
Цитата:
в который загружается текстовый файл
это XML файл(одна из разновидностей текстового)
для него есть стандартные библиотеки.
1. читать файл как XML.(и получать DOM-модель)
2. составлять combo-список с учетом DOM- модели. AddObjects('... ', ...);
3. при выборе использовать данные из ассоцированного DOM-объекта
Код:
x:=ComboBox.Items.Objects[ComboBox.ItemIndex];
Edit1.Text:=r.x.....
Edit2.Text:=x.....
а так ли уж нужны эти Edit...?
только посмотреть.
...

2.
Цитата:
Но, создается файл с нулевым объемом.
Цитата:
Код:
var
  soundTrack: array of integer;
begin
...
   FS.Write(SoundTrack[0], SizeOf(Integer) * Length(SoundTrack));
Length(SoundTrack) =0 =>запись массива НУЛЕВОЙ длины. =>
Цитата:
, создается файл с нулевым объемом.
да еще надо будет заполнить (а чем? ) этот самый массив.
Код:
SetLength(SoundTrak, ??? );
SoundTrak[0{1,2, ...}]:=???
он заполняется ГДЕ-то в другом месте.
НЕТ. Этот локальный массив нигде более НЕ доступен.
и заполняется где-то там совсем другой массив.
Код:
var
  soundTrack: array of integer;
begin
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.06.2019 в 09:50.
evg_m вне форума Ответить с цитированием
Старый 10.06.2019, 12:20   #3
TheKwon
 
Регистрация: 09.06.2019
Сообщений: 4
По умолчанию

Спасибо большое за ответ.
Всё таки неплохо было бы посмотреть саму программу:
https://drive.google.com/file/d/1kPH...PCKUUxwYb/view

Цитата:
Сообщение от evg_m Посмотреть сообщение
а так ли уж нужны эти Edit...?
только посмотреть.
Для кнопки проигрывания звука,
где указано откуда начинать и через сколько миллисекунд заканчивать прослушивание выбранного участка звукового файла.

Цитата:
Сообщение от evg_m Посмотреть сообщение
это XML файл(одна из разновидностей текстового)
для него есть стандартные библиотеки.
В данном случае он нужен только как *.ТХТ.
Ещё раз благодарю за ответ, но, посмотрите пожалуйста исходники для более ясной картины.

С Уважением, TheKwon.
TheKwon вне форума Ответить с цитированием
Старый 10.06.2019, 18:03   #4
TheKwon
 
Регистрация: 09.06.2019
Сообщений: 4
По умолчанию

Да, получилось заполнить эдиты, спасибо, извините, что не вышло сразу.
Там, оказывается, Вы просто ошиблись в одной букве и из-за этого сначала не получалось.
Нужно DelimitedText а было написано DelimiterText.

Этот код, благодаря Вам, заработал нормально:

Код:
procedure TFormPlayer.ComboSoundChange(Sender: TObject);
var
  R: TStringList;
begin
  R:=TStringList.Create;
  R.Delimiter:=' ';
  R.DelimitedText:=ComboSound.Text;
  EditStart.Text:=R.Values['s'];
  EditEnd.Text:=R.Values['l'];
  R.Free;
end;
Но, теперь появилась другая проблема.
В эдиты загружаются все знаки а нужны только цифры.
Как убрать отображение (не ввод - Key) символов для ТEdit - '"', '/', '>' в событии ComboSoundChange или EditChange?
Поскольку их приходится удалять вручную чтобы заработала кнопка проигрывателя.

Вот, изображение программы с лишними символами в эдитах:


Пожалуйста, помогите исправить.

Последний раз редактировалось TheKwon; 10.06.2019 в 18:55.
TheKwon вне форума Ответить с цитированием
Старый 11.06.2019, 09:50   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

1.известный набор исключений и любой текст
Код:
s:=' "23456"  ';
s:=StringReplace(s, '"', '', [rfReplaceAll]);
s:=StringReplace(s, '/>', '', [rfReplaceAll]);
...
s:=Stringreplace(s, ' ', '', []rfReplaceAll]);
//s:='23456';
2.известный набор разрешений и любой набор исключений
Код:
for j:=1 to length(s) do 
  if not (s[j] in ['0'..'9']) then s[j]:=' ';
s:=StringReplace(s, ' ', '', [rfReplaceAll]);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 11.06.2019 в 09:53.
evg_m вне форума Ответить с цитированием
Старый 16.06.2019, 14:01   #6
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Ранее я когда-то писал под HTML-страницы:
Код:
function Teg(s, imja, swojstwo: string; var apostrof: char): string;
var n,n1:integer;
    s1:string;
begin
{*****************************************}
{                                         }
{ Находит значение свойства               }
{                                         }
{ s        = '<table width=5 border="1">' }
{ imja     = 'table'                      }
{ sw_wo    = 'border'                     }
{ apostrof = '"'                          }
{ Result   = '1'                          }
{                                         }
{*****************************************}
   Result:='';
   apostrof:=' ';
   n:=Pos(imja,s);
   If n=0 then
      Exit;
   n:=n+Length(imja)+1;
   s:=Copy(s,n,Length(s));// width=5 border="1">
   Repeat
      While (Length(s)>0) and (s[1]=' ') do
         Delete(s,1,1);//width=5 border="1">//border="1">{удаление пробелов в}
            {начале s}
      n:=Pos('=',s);
      If n>0 then
         s1:=Copy(s,1,n-1) else//width//border
         Exit;
      If swojstwo=s1 then
         Break;
      apostrof:=' ';
      If (Length(s)>n) and ((s[n+1]='"') or (s[n+1]='''')) then
         apostrof:=s[n+1];
      If apostrof=' ' then
         Delete(s,1,n) else
         Delete(s,1,n+1);//5 border="1">//1">
      n:=Pos(apostrof,s);
      If n>0 then
         Delete(s,1,n) else//border="1">//>
         Exit;
   Until (Length(s)=0) or (n=0);
   n:=Pos(swojstwo,s);
   If n=0 then
      Exit;
   n:=n+Length(swojstwo)+1;
   s:=Copy(s,n,Length(s));//5 border="1">//"1">
   If (Length(s)>0) and ((s[1]='"') or (s[1]='''')) then
      apostrof:=s[1];
   If apostrof<>' ' then
      Delete(s,1,1);//5 border="1">//1">
   n:=Pos(apostrof,s);
   If n>0 then
      s:=Copy(s,1,n-1) else//5//1
   begin
      n:=Pos('>',s);
      n1:=Pos('/>',s);
      If n<n1 then
         n1:=n;
      If n1>0 then
         n:=n1;
      If n>0 then
         s:=Copy(s,1,n-1);//5 border="1"//1"
   end;
   Result:=s;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s,s1:string;
    a:char;
begin
   s:='<t id="4" s="7995" l="1126"/>';
   s1:=Teg(s,'t','id',a);
   Caption:=s1;
   s1:=Teg(s,'t','s',a);
   Caption:=Caption+' '+s1;
   s1:=Teg(s,'t','l',a);
   Caption:=Caption+' '+s1;
end;
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 18.06.2019, 16:40   #7
TheKwon
 
Регистрация: 09.06.2019
Сообщений: 4
По умолчанию

Спасибо большое.
Простите не увидел раньше.
А проблему помогли решить так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;

  function GetNumStr(id, s: String): String;
  var
    i: Integer;
    ts: String;
  begin
    Result := '';
    if Length(s) > 0 then begin
      i := Pos(id, s);
      if i > 0 then begin
        i := i + Length(id);
        while (i < Length(s)) and (not (s[i] in ['0'..'9'])) do
          i := i + 1;
          ts := '';
        while (i < Length(s)) and ((s[i] in ['0'..'9'])) do begin
          ts := ts + s[i];
          i := i + 1;
        end;
        Result := ts;
      end else begin
        exit;
      end;
    end;
  end;

begin
    s := ComboSound.Text;
    EditStart.Text := GetNumStr('s="', s);
    EditEnd.Text := GetNumStr('l="', s);
end;
Извините, пожалуйста, что беспокоил.
С Уважением, TheKwon.
TheKwon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При выборе значения одного из трёх ComboBox выводить значение в Label TeliS Общие вопросы Delphi 2 23.09.2013 18:47
Значения из ComboBox + Edit поместить в DBGrid sveta_s БД в Delphi 7 05.06.2011 04:38
Combobox и itemindex Максим139 Помощь студентам 2 02.04.2011 18:30
Поиск в листе Excel одного значения несколько раз Andr3000 Microsoft Office Excel 2 23.04.2010 10:24
Combobox itemindex beemoto Общие вопросы Delphi 28 06.05.2009 14:09