Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Табуляция в combobox ?


Автор: Чучмек 28.12.2011, 16:49
Как организовать табуляцию в combobox
Нужно в выпадающем списке получить:
Код

...
0012        ghjhg        hhgj
0013        hgfh         hghjkj
0014        hj           bvj
...



Вместо:
...
0012IghjhgIhhgj
0013IhgfhIhghjkj
0014IhjIbvj
...

Автор: mistrmax 28.12.2011, 18:07
Код

procedure TForm1.tabulation;
var
i,count:integer;
p1:integer;
s:string;
begin
  count:=ComboBox1.Items.Count;
  for i:=0 to count-1 do begin
  s:=ComboBox1.Items.Strings[i];
  while pos('I',s) <> 0 do
  begin
    p1:=pos('I',s);
    Delete(s,p1,1);
    Insert(#09,s,p1);
    ComboBox1.Items.Strings[i]:=s;
  end;
  end;
end;

Будет видная после нажатия на элемент. А так почему-то не воспринимается.

Автор: Данкинг 28.12.2011, 18:10
Код

function tab (kolvo: integer): string;
 var
  j:integer;
 begin
  result:='';
  for j:=1 to kolvo do
   result:=result+'       ';
 end;

 smile

Добавлено через 1 минуту и 15 секунд
mistrmax, что за I у тебя такая?
Цитата(mistrmax @  28.12.2011,  19:07 Найти цитируемый пост)
 while pos('I',s) <> 0 do

Символ табуляции может и квадратиком отображаться.

Автор: mistrmax 28.12.2011, 18:19
Данкинг,  так у него в примере I нужно на символ табуляции заменить. Если захочет потом сивол сам заменит. А пробелы я тоже хотел предложить вот только выглядить будет не как три колонки.

Автор: Чучмек 28.12.2011, 18:36
Цитата(mistrmax @  28.12.2011,  18:19 Найти цитируемый пост)
так у него в примере I нужно на символ табуляции 

Да не, в примере I  - это квадратик, который вместо  символа табуляции (^I) отображается.

Автор: mistrmax 28.12.2011, 19:28
Вообщем вот:
Код

 public
    { Public declarations }
    procedure tabulation;
    function extractSecondPart(s:string):string;
  end;
...
procedure TForm1.tabulation;
var
i,count,j,longest_length,r:integer;
p1:integer;
s,sp,tmp:string;
begin
  //находим найдлиннейший элемент
  longest_length:=0;
  tmp:='';
  count:=ComboBox1.Items.Count;
  for i:=0 to count-1 do begin
    sp:=extractSecondPart(ComboBox1.Items.Strings[i]); //отрезаем среднюю часть
    if length(sp)>longest_length then
    longest_length:=length(sp);
  end;
  //вставляем "пробеляцию" хДД
  for i:=0 to count-1 do begin
    s:=ComboBox1.Items.Strings[i];
    //после первой колонки вставляем 4 пробела
    sp:=extractSecondPart(ComboBox1.Items.Strings[i]);
    p1:=pos('I',s);
    Delete(s,p1,1);
    Insert('    ',s,p1);
    //находим разнице между найдлиннейшим и текущим
    r:=longest_length-length(copy(s,9,pos('I',s)-9));
    if r = 0 then tmp:=' ';
    //генерируем пробелы хДД
    for j:=1 to r do tmp:=tmp+'_';
    //вставляем
    p1:=pos('I',s);
    Delete(s,p1,1);
    Insert('____'+tmp,s,p1);
    ComboBox1.Items.Strings[i]:=s;
    tmp:='';
  end;
end;

function TForm1.extractSecondPart(s: string): string;
begin
  delete(s,1,pos('I',s));//удаляем до первого I
  delete(s,pos('I',s),length(s)-pos('I',s)+1);
  result:=s;
end;

Теперь осталось выбрать какой-нибудь пробел http://ru.wikipedia.org/wiki/Пробел#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D0.B1.D0.B5.D0.BB.D1.8B_.D0.B2_.D1.8E.D0.BD.D0.B8.D0.BA.D0.BE.D0.B4.D0.B5 и всё будет так как надо. Я сейчас ещё подумаю, может найду подходящий по величине.
В этих ваших квадратиках я не разбираюсь, можете вставлять вместо I, что хотите. К примеру | подошло бы

Добавлено через 8 минут и 38 секунд
Код

    for j:=1 to r do tmp:=tmp+'  '; //тут теперь два пробела хД
    showmessage(inttostr(length(tmp)));
    //вставляем
    p1:=pos('I',s);
    Delete(s,p1,1);
    Insert('    '+tmp,s,p1);

Вот так всё работает. Могут быть конечно косяки. ХЗ в каких случаях они сдвигаются.

Автор: Dik0n 28.12.2011, 20:20
Можно реализовать отрисовку самому, сколько хочешь колонок и каким угодно шрифтом.

Код

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin

end;

Автор: Чучмек 28.12.2011, 21:03
mistrmax, вопрос не в этом.
Вопрос в том, КАК заставить ComboBox корректно отображать  ansi символ #9 средствами ObjecInspector+SendMessage/Perform 

Автор: northener 29.12.2011, 00:45
Цитата(Чучмек @  28.12.2011,  21:03 Найти цитируемый пост)
Вопрос в том, КАК заставить ComboBox корректно отображать  ansi символ #9 средствами ObjecInspector+SendMessage/Perform 

Вопрос "Как заставить ComboBox корректно отображать  ansi символ #9 средствами ObjecInspector+SendMessage/Perform" просто глупый. 
Спросите ещё "Как заставить ComboBox корректно отображать  ansi символ #7" smile

Автор: mistrmax 29.12.2011, 14:21
northener, +1

Чучмек, ну так пиши свой компонент, кто мешает. 
Если так сильно надо именно на три колонки разбить, то и моё решение вполне подойдёт.

Автор: Чучмек 31.12.2011, 19:48
Цитата(northener @  29.12.2011,  00:45 Найти цитируемый пост)

Вопрос "Как заставить ComboBox корректно отображать  ansi символ #9 средствами ObjecInspector+SendMessage/Perform" просто глупый. 

northener,  ответ не умнее.

Вот dll-ка, подключи её в *.dpr и посмотри как будут отображаться табы в любом combobox-се.
Код

program Project1;

uses
  Forms,
  windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
  var h:cardinal;
begin
  h:=loadlibrary('CB_tab.dll');
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  freelibrary(h);
end.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)