Другие языки программирования и технологии

В делфи нужно заменить группу пробелов одним. как считать сделал а изменить как незнаю

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
ListBox1: TListBox;
ListBox2: TListBox;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
t:textfile;
s,n:string;
i,p,r,h:integer;
m:array[1..10] of string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
AssignFile(t,'d:\file.txt');
reset(t);
s:='';
for i:=1 to 10 do
begin
readln(t,m);
s:=s+m;
ListBox1.Items.Add(m);
end;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ListBox1.Clear;
ListBox2.Clear;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

end;

end.
Считывание можно сделать проще
ListBox.Items.LoadFromFile('d:\file.txt');

А замену можно сделать так:
переносишь одну строку в другую посимвольно, если встретился пробел, заносишь его, а следующие пробелы пропускаешь.
Или по такому принципу

while pos(' ', st) > 0 do delete(st, pos(' ', st), 1);
Паша Соколов
Паша Соколов
8 247
Лучший ответ
В рецептах выше есть многократный вызов Delete, что весьма неэффективно. Так быстрее:

procedure TForm1.Button2Click(Sender: TObject);
var
    c, k, n: Integer;
    s: String;
begin
    for c := 0 to ListBox1.Items.Count - 1 do begin
        s := ListBox1.Items[c];
        n := 1;
        for k := 2 to Length(s) do begin
            if (s[k] <> ' ') or (s[n] <> ' ') then begin
                inc(n);
                s[n] := s[k];
            end;
        end;
        Delete(s, n + 1, 255);
        ListBox2.Items.Add(s);
    end;
end;
А зачем их считать? Бери и удаляй!

// оставляет по одному пробелу между словами в строке
for i:= Length(S) downto 2 do if (S[ i ] = ' ') and (S[i - 1] = ' ') then Delete(S, i, 1);

Кстати, а что вы "считаете"? Строки что-ли? Тогда почему в цикле от одного и до десяти? Если нужно строки поместить в листбокс, то прислушайтесь к совету Striker. Гарантировано все строки будут там. И удалять можно так, как предложено.

while pos(' ', st) > 0 do delete(st, pos(' ', st), 1);

Только при первом обращении к Pos() надо искать ДВА пробела, а при удалении ОДИН. Упс.. . Кстати, майл прибивает повторяющиеся пробелы, так что думаю, что Striker не ошибся.
Егор Киргизов
Егор Киргизов
59 614