Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со StringGrid'ом и не только, помогите разобраться! 
:(
    Опции темы
MacTep
  Дата 16.6.2004, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Помогите, кто может! У меня есть несколько вопросов:

1) На форме есть компонент StringGrid. Его свойство Options.goRowCount установлено в True. Как мне узнать в любой момент времени, сколько именно и какие строки выделены? Вообще, есть ли какое-нибудь свойство у StringGrid'а, которое отвечает за выделение ячеек или целых строк?

2) Еще вопрос по StringGrid'у. Как сделать так, чтобы вывести на печать содержимое StringGrid'a в виде таблицы?

3) Как вывести на печать содержимое формы без заголовка, т.е. только то, что лежит внутри окна формы?

4) Вопрос не в тему, но все-таки вопрос: какая из сортировок массивов эффективнее всего сортирует массивы длинной где-то 500-1500 элементов. Очень надо сортировать, но простыми сортировками получается очень медленно!

Заранее всем спасибо! Буду рад, если получу исчерпывающие ответы на свои вопросы! cool.gif


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Serggggg
Дата 16.6.2004, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



(2). Я так решаю проблему с DBGrid'ом - Через EXCEL! Поднять ядро Excel, создать/открыть документ (готовый шаблон ведомости, например).
А потом 2 цикла - по кол-ву строк и по кол-ву столбцов - выводят в нужные ячейки ячейки Grid'а - Excel.Cells.Item[i,j].Value:=...
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
Serggggg
Дата 16.6.2004, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



(4). В принципе, нас ещё со времен 1-го курса учили сортировать так (по-крайней мере, преподы утверждали, что это лучший способ):
Код

var
i,j :integer;
k :real;
X :array[1..N] of real;
begin
j:=0;
LABEL1:
for i:=1 to N-1 do begin
     if X[i]>X[i+1] then begin
        k:=X[i];
        X[i]:=X[i+1];
        X[i+1]:=k;
        j:=j+1;
        end;
if j>0 then goto LABEL1
end;


Т.е. признак того, была ли произведена в ходе проверки хотя бы одна перестановка элементов (в данном примере - j). Когда в последний раз массив будет просмотрен и будет обнаружено, что он упорядочен, то j будет равняться 0 - задача решена.
Добавлено @ 10:11
Прошу прощения - в строке
Код
for i:=1 to N-1 do begin

слово BEGIN нужно убрать или перед строкой
Код
if j>0 then goto LABEL1

вставить ещё 1 end;
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 16.6.2004, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Уважайте правила форума!!! Один топик - один вопрос!

№3: Это как?
PM   Вверх
MacTep
Дата 16.6.2004, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



1) Помогите именно со StringGrid'ом, так как проблема именно в нем. Не надо сюда Excel приплетать.
2) За правила форума простите, я обязательно исправлюсь!
3) Про печать StringGrid'а обязательно подскажите, я же знаю, что здесь полно умных людей.
4) Сортировку "пузырьком" (а именно такая и была предложена) не предлагать. Это все лажа. Есть более эффективные сортировки. Ок?

По поводу третьего вопроса: есть форма. Там кнопки, все такое прочее. Так вот как это все такое прочее и кнопки вывести, но только так, чтобы не было видно, что вывелось целое окно? Доходчиво?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Serggggg
Дата 16.6.2004, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



Пожалуйста.
Ищи более эффективные методы. Только грубить не надо - я всего лишь предложил свой вариант. Я же не ручался за то, что это самое рациональное решение.
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
Albinos_x
Дата 16.6.2004, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



По сортировке:
// сортировка массива целых чисел с вабором минимального элемента

procedure MinSortInt( var M : array of integer );
var i, j, n, Imin, Rtmp: integer;
begin
N:=High(M);
for i:=0 to N-1 do
begin
Imin:=N;
for j:=n-1 downto i do
if (M[j] <= M[Imin]) then
Imin:=j;
if (i<Imin) then
begin
// Перестановка элементов
Rtmp:=M[Imin];
M[Imin]:=M[i];
M[i]:=Rtmp;
end;
end;
end;

Немного усовершенствованная пузырьковая сортировка.
Совершенствование заключается в том, что в пузырьковой сортировке
количество сравнений n*(n-1)/2
количество перестановок n*(n-1)/2
в предложенной
количество сравнений n*(n-1)/2
количество перестановок n-1
недостаток метода:
Если массив отсортирован, то все равно будут сделаны все сравнения, а метод пузырьковой сорировки ограничится n-1 сравнением


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
MacTep
Дата 17.6.2004, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Парни, никто не кому не грубил!!! А про быструю сортировку никто не слышал что ли?

Про StringGrid подскажитете, как там с выделением быть! Очень надо. И как содержимое StringGrid'а распечатать? Это самое главное!!! sad.gif


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
x77
Дата 18.6.2004, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



MacTep, руками его печатать, как ещё... через TPrinter.Canvas. говоришь ему BeginDoc, рисуешь в цикле построчно, говоришь EndDoc.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Albinos_x
Дата 18.6.2004, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



активную ячейку можно получить:

StringGrid1.Selection.Left - столбец

StringGrid1.Selection.Top - строка


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
x77
Дата 18.6.2004, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



... а всё выделение, соответственно, через Selection.Right / Selection.Bottom


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Albinos_x
Дата 18.6.2004, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата
... а всё выделение, соответственно, через Selection.Right / Selection.Bottom


совершенно точно, забыл что нужно получить несколько выделенных ячеек, поэтому не указал


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
MacTep
Дата 18.6.2004, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



x77, можно поподробнее с Canvas. Я с этим делом мало работал (почти не работал совсем), поэтому плохо пока в этом разбираюсь. Можно что-то типа исходного текста.

Про Selection тоже чуть подробнее. Ведь это всего лишь свойство, а как посмотреть, выставлено оно или нет?

Про форму: если я напишу Form1.Print, то что я получу на бумаге? Ответьте, пожалуйста.



--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
U
Дата 19.6.2004, 10:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

procedure TForm1.Button1Click(Sender: TObject);
var K: Double;
begin
Printer.BeginDoc;
K :=  Printer.Canvas.Font.PixelsPerInch / Canvas.Font.PixelsPerInch*1.2;

PrintStringGrid(StrGrid,
  K,   // Коэффициент
  200, // отступ от края листа в пихелах по Х
  200, // --"-- по Y
  200  // отступ снизу
  );

Printer.EndDoc;
end;


{----------------------------------------------------------}

unit GrdPrn3;

interface

uses
Windows, Classes, Graphics, Grids, Printers, SysUtils;

const
OrdinaryLineWidth: Integer = 2;
BoldLineWidth: Integer = 4;

procedure PrintStringGrid(Grid: TStringGrid; Scale: Double; LeftMargin, TopMargin, BottomMargin: Integer);

function DrawStringGridEx(Grid: TStringGrid; Scale: Double; FromRow,  LeftMargin, TopMargin,
Yfloor: Integer; DestCanvas: TCanvas): Integer;
// возвращает номер строки, которая не поместилась до Y = Yfloor

// не проверяет, вылезает ли общая длина таблицы за пределы страницы
// Слишком длинное слово обрежется

implementation

procedure PrintStringGrid(Grid: TStringGrid; Scale: Double; LeftMargin, TopMargin, BottomMargin: Integer);
var NextRow: Integer;
begin
//Printer.BeginDoc;

if not Printer.Printing then raise Exception.Create('function PrintStringGrid must be called between Printer.BeginDoc and Printer.EndDoc');

NextRow := 0;
repeat
  NextRow := DrawStringGridEx(Grid, Scale, NextRow, LeftMargin, TopMargin,
    Printer.PageHeight - BottomMargin, Printer.Canvas);
  if NextRow <> -1 then Printer.NewPage;
until NextRow = -1;

//Printer.EndDoc;
end;

function DrawStringGridEx(Grid: TStringGrid; Scale: Double; FromRow,  LeftMargin, TopMargin,
Yfloor: Integer; DestCanvas: TCanvas): Integer;
// возвращает номер строки, которая не поместилась до Y = Yfloor
var
i, j, d, TotalPrevH, TotalPrevW, CellH, CellW, LineWidth: Integer;
R: TRect;
s: string;


  procedure CorrectCellHeight(ARow: Integer);
  // вычисление правильной высоты ячейки с учетом многострочного текста
  // Текст рабивается только по словам слишком длинное слово обрубается
  var
    i, H: Integer;
    R: TRect;
    s: string;
  begin
    R := Rect(0, 0, CellH*2, CellH);
    s := ':)'; // Одинарная высота строки
    CellH := DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
        DT_LEFT or DT_TOP or DT_WORDBREAK or DT_SINGLELINE or DT_NOPREFIX or DT_CALCRECT) + 3*d;
    for i := 0 to Grid.ColCount-1 do
    begin
      CellW := Round(Grid.ColWidths[i]*Scale);
      R := Rect(0, 0, CellW, CellH);
      //InflateRect(R, -d, -d);
      R.Left := R.Left+d;
      R.Top := R.Top + d;


      s := Grid.Cells[i, ARow];
      H := DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
        DT_LEFT or DT_TOP or DT_WORDBREAK or DT_NOPREFIX or DT_CALCRECT); // Вычисление ширины и высоты текста
      if CellH < H + 2*d then CellH := H + 2*d;
      // if CellW < R.Right - R.Left then Слишком длинное слово - не помещается в одну строку;
      // Перенос слов не поддерживается
    end;
  end;

begin
Result := -1; // все строки уместились между TopMargin и Yfloor
if (FromRow < 0)or(FromRow >= Grid.RowCount) then Exit;

DestCanvas.Brush.Style := bsClear;
DestCanvas.Font := Grid.Font;
//  DestCanvas.Font.Height := Round(Grid.Font.Height*Scale);
DestCanvas.Font.Size := 10;

Grid.Canvas.Font := Grid.Font;
Scale := DestCanvas.TextWidth('test')/Grid.Canvas.TextWidth('test');

d := Round(2*Scale);
TotalPrevH := 0;

for j := 0 to Grid.RowCount-1 do
begin
  if (j >= Grid.FixedRows) and (j < FromRow) then Continue;
  // Fixed Rows рисуются на каждой странице

  TotalPrevW := 0;
  CellH := Round(Grid.RowHeights[j]*Scale);
  CorrectCellHeight(j);

  if TopMargin + TotalPrevH + CellH > YFloor then
  begin
    Result := j; // j-я строка не помещается в заданный диапазон
    if Result < Grid.FixedRows then Result := -1;
    // если фиксированные строки не влезают на страницу - это тяжёлый случай...
    Exit;
  end;

  for i := 0 to Grid.ColCount-1 do
  begin
    CellW := Round(Grid.ColWidths[i]*Scale);

    R := Rect(TotalPrevW, TotalPrevH, TotalPrevW + CellW, TotalPrevH + CellH);
    OffSetRect(R, LeftMargin, TopMargin);

    if (i < Grid.FixedCols)or(j < Grid.FixedRows) then LineWidth := BoldLineWidth
    else LineWidth := OrdinaryLineWidth;

    DestCanvas.Pen.Width := LineWidth;
    if LineWidth > 0 then
      DestCanvas.Rectangle(R.Left, R.Top, R.Right+1, R.Bottom+1);

    //InflateRect(R, -d, -d);
    R.Left := R.Left+d;
    R.Top := R.Top + d;

    s := Grid.Cells[i, j];
    DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
      DT_LEFT or DT_TOP or DT_WORDBREAK or DT_NOPREFIX);

    TotalPrevW := TotalPrevW + CellW; // Общая ширина всех предыдущих колонок
  end;

  TotalPrevH := TotalPrevH + CellH;   // Общая высота всех предыдущих строк
end;
end;

end.

  Вверх
MacTep
Дата 19.6.2004, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Благодарю автора предыдущего сообщения. А никто так и не ответил на вопрос: что будет если вызвать такую команду Form1.Print?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.