Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Орловский Дмитрий
Статус: Академик
Рейтинг: 4784
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2630
∙ повысить рейтинг »
cradlea
Статус: Практикант
Рейтинг: 1754
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Delphi и Lazarus

Номер выпуска:1595
Дата выхода:16.05.2011, 00:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:252 / 181
Вопросов / ответов:1 / 1

Вопрос № 183114: Уважаемые эксперты! Помогите реализовать вот такую вещь. Я написал симплекс метод на делфи, и хочу чтобы каждая таблица помешалась в компонет PageControl (в новую закладку). Т.е получилось при решении симплекс методом 4 таблицы и должно...



Вопрос № 183114:

Уважаемые эксперты!
Помогите реализовать вот такую вещь.
Я написал симплекс метод на делфи, и хочу чтобы каждая таблица
помешалась в компонет PageControl (в новую закладку).
Т.е получилось при решении симплекс методом 4 таблицы и должно быть 4 закладки,и в каждой своя таблица.
Заранее спасибо.С Уважением!!! С днем победы!!!
Вот программа.(http://rfpro.ru/d/5463.rar)

Отправлен: 10.05.2011, 23:49
Вопрос задал: Павел Швецов (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Евгений/Genia007/ (Профессионал) :
Здравствуйте, Павел Швецов!
Таким образом можно программно создавать страницы на TPageControl и на новой закладке уже Stringgrid.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
Tab: TTabSheet;
begin
i:= PageControl1.PageCount;

// Создаем страницу
Tab:= TTabSheet.Create(PageControl1);
with Tab do
begin
Visible:= True;
Caption:= 'Новая страница ' + IntToStr(i + 1);
PageControl:= PageControl1; // Назначаем Tab в Page Control
end;

// Создаем Stringgrid на новой странице
with TStringGrid.Create(Application) do
begin
Parent:= PageControl1.Pages[i]; // Указываем Stringg rid родительскую страницу
Name:= 'StringGrid' + IntToStr(i + 1);
Left:= 0;
Top:= 0;
ColCount:= 2; // Нужное количество столбцов
RowCount:= 2; // Нужное количество строк
Cells[0, 0]:= 'Нов таб' + IntToStr(i + 1); // Заполняем нужные ячейки данными
end;

PageControl1.ActivePage:= PageControl1.Pages[i]; // Переключаемся на новую страницу
end;
А вот исправленный Ваш код с автоматическим созданием закладок
Код:
procedure TForm1.N7Click(Sender: TObject);
var j, i: integer;
Tab: TTabSheet;
begin
i2:=0; t:=0; u:=0; y:=0; i1:=0;
// отчищаем PageControl1
while PageControl1.PageCount < ;> 0 do
PageControl1.Pages[0].Destroy;
//запоминаем сколько <=,>= и где что стоит
for i:=1 to m do
begin
if (stringgrid2.cells[n,i]='>=') then
begin
u:=u+1;
l[i]:=-2;
end;
if (stringgrid2.cells[n,i]='<=') then
begin
u:=u+1;
l[i]:=-1;
end;
if (stringgrid2.cells[n,i]='=') then
l[i]:=i;
end;
//заполняю массив а и b
w:=0;
y:=0;
for j:=1 to m do
b[j]:=strtofloat(StringGrid2.Cells[n+1,j]);
for i:=1 to m do
begin
t:=0;
w:=w+1;
for j:=0 to n+u-1 do
begin
t:=t+1;
if (0<=j) and (j<n) then
a[i,t]:=strtofloat(StringGrid2.Cells[j,i]);
if (l[w]=-2)and(j>=n) then
begin
a[i,n+i]:=-1;
end;
if (l[w]=-1)and(j>=n)then
begin
a[i,n+i]:=1;
end;
if (l[w]=0)and(j>=n)then
a[i ,n+i]:=0;
end;
end;
//строим первую симплек таблицу
stringgrid1.colcount:=n+m+2;
stringgrid1.rowcount:=m+2;
stringgrid1.fixedcols:=1;
stringgrid1.fixedrows:=1;
form2.stringgrid1.colcount:=n+m+2;
form2.stringgrid1.rowcount:=m+2;
form2.stringgrid1.fixedcols:=1;
form2.stringgrid1.fixedrows:=1;
t:=0; y:=1;

//1-ятаблица
stringgrid1.cells[0,0]:='Базис';
stringgrid1.cells[1,0]:='Свободные члены';
stringgrid1.cells[0,u+1]:='F';

//последняя таблица
form2.stringgrid1.cells[0,0]:='Базис';
form2.stringgrid1.cells[1,0]:='Свободные члены';
form2.stringgrid1.cells[0,u+1]:='F';

//1-я таблица
f[1]:=0;
for i:=2 to n+u+1 do
begin
if (i<=n+1) then
begin
f[i]:=strtofloat(stringgrid3.cells[t,1]);
if f[i]<0 then f[i]:=abs(f[i]);
if f[i]>=0 then f[i]:=-f[i];
t:=t+1;
end
els e
f[i]:=0;
end;
for i:=1 to n+u+1 do
begin
y:=y+1;
stringgrid1.cells[y,0]:='X'+inttostr(i);
fo r j:=1 to m+1 do
begin
if(n+i<=n+u) then stringgrid1.cells[0,y-1]:='X'+inttostr(n+i);
if(n+i<=n+u) then form2.stringgrid1.cells[0,y-1]:='X'+inttostr(n+i);
if (j=m+1)then stringgrid1.cells[i,j]:=floattostr(f[i]);
if (i=1)and(j<=m) then
stringgrid1.cells[i,j]:=floattostr(b[j]);
if (i>=1)and(j<=m) then
stringgrid1.cells[i+1,j]:=floattostr(a[j,i]);
end;
end;
min:=f[1];
for i:=1 to n+u+1 do
begin
if (min>f[i]) then
begin
min:=f[i];
k:=i;
end;
end;
k:=k-1;
for i:=1 to m do
begin
if ((b[i]>0)and (a[i,k]>0)or(b[i]<0)and (a[i,k]<0)) then c[i]:=b[i]/a[i,k];
if ((b[i]=0) and (a[i,k]>0)) then c[i]:=0;
if (a[i,k]=0) then c[i]:=9999;
if ((b[i]=0) and (a[i,k]<0)) then c[i]:=9999;
if ((b[i]>0)and (a[i,k]<0)or(b[i]<0)and (a[i,k]>0)) then c[i]:=9999
end;
v:= 0;
for i:=1 to m do
if(c[i]=0)or(c[i]=9999) then v:=v+1;

//цикл по построению новой симплекс таблици
r:=0;
while (min<0)and(r<=10)and(v<m) do
begin
r:=r+1;; i1:=i1+1;

// Создаем страницу
Tab:= TTabSheet.Create(PageControl1);
with Tab do
begin
Visible:= True;
Caption:= 'Таблица ' + IntToStr(i1);
PageControl:= PageControl1; // Назначаем Tab в Page Control
end;

//строим массив оценочных отношений(с)
for i:=1 to m do
begin
if ((b[i]>0)and (a[i,k]>0)or(b[i]<0)and (a[i,k]<0)) then c[i]:=b[i]/a[i,k];
if ((b[i]=0) and (a[i,k]>0)) then c[i]:=0;
if (a[i,k]=0) then c[i]:=9999;
if ((b[i]=0) and (a[i,k]<0)) then c[i]:=9999;
if ((b[i]>0)and (a[i,k]<0)or(b[i]<0)and (a[i,k]>0)) then c[i]:=9999
end;
min:=c[1];
for i:=1 to m do
if (min>=c[i]) then
begin
min:=c[i];
p:=i;
end;
for i:=1 to m do
b1[i]:=b[i];
for i:=1 to m do
for j:=1 to n+u do
a1[i,j]:=a[i,j];
for i:=1 to n+u+1 do
f1[i]:=f[i];
//пересчитываем столбец свободных членов(массив b)
for i:=1 to m do
if (i=p) then
b[i]:=b1[i]/a[p,k]
else
b[i]:=b1[i]-b1[p]*a1[i,k]/a1[p,k];
//пересчитываем целевую функцию(массив F)
f[1]:=f1[1]-b1[p]*f1[k+1]/a1[p,k];
o:=2;
for i:=1 to n+u+1 do
begin
if(i<>k) then
f[o]:=f1[o]-a1[p,i]*f1[k+1]/a1[p,k]
else f[o]:=0;
o:=o+1;
end;
o:=0;
//Пересчитываем матрицу переменных (а)
for i:=1 to m do
for j:=1 to n+u do
begin
if ((i<>p)or(j<>k)) then
a[i,j]:=a1[i,j]-a1[p,j]*a1[i,k]/a1[p,k];
if (i=p) then
a[i,j]:=a1[i,j]/a1[p,k];
if (j=k)and(i<>p) then
a[i,j]:=0;
end;

//Формируем новую таблицу в стрингрид
y:=1;
with TStringGrid.Create(Application) do
begin
Parent:= PageControl1.Pages[i1 - 1]; // Указываем Stringgrid родительскую страницу
Name:= 'StringGrid' + IntToStr(i1);
Left:= 0; Top:= 0;
ColCount:= n+m+2; // Нужное количество столбцов
RowCount:= m+2; // Нужное количество строк
for i:=1 to n+u+1 do
begin
y:=y+1;
form2.stringgrid1.cells[y,0]:='X'+inttostr(i);
for j:=1 to m+1 do
begin
if(j=p) then
cells[0,j]:='X'+inttostr(k);
if (j=m+1)then cells[i,j]:=floattostr(f[i]);
if (i=1)and(j<=m) then
cells[i,j]:=floattostr(b[j]);
if (i>=1)and(j<=m) then
cells[i+1,j]:=floatto str(a[j,i]);
end;
end;
end;
PageControl1.ActivePage:= PageControl1.Pages[0]; // Переключаемся на но вую страницу

//ищем min среди целевой функции
min:=f[1];
k:=0;
for i:=1 to n+u+1 do
begin
if (min>=f[i]) then
begin
min:=f[i];
k:=i;
end;
end;
k:=k-1; v:=0;
for i:=1 to m do
if(c[i]=0)or(c[i]=9999) then v:=v+1;
end;
s:='';
z:=0;
if (r<=10)and(v<m) then
for i:=1 to u do
begin
z:=1;
s:=s+floattostr(b[i]);
if i<u then s:=s+',';
end
else
if ((r=0)or(r=11))or(v=m)or(min<0) then
s1:='Функция не имеет оптимального значения';
if (z=1) then label1.caption:='{'+s+'}'
else
label1.caption:=s1;
end;
Правильней делать локальные переменные для циклов, а не как у Вас было, Вы использовали глобальные переменные. Вот весь Ваш проект.
-----
Помогли тебе, помоги и ты.

Ответ отправил: Евгений/Genia007/ (Профессионал)
Ответ отправлен: 14.05.2011, 18:58
Номер ответа: 267152
Казахстан, Петропавловск
Тел.: 87776918987
Адрес сайта: Выложены мои программы со статусом freeware
ICQ # 573729535
Абонент Skype: jonixjon

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267152 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное