Anonymní profil Zeel – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Zeel – Programujte.comAnonymní profil Zeel – Programujte.com

 

Příspěvky odeslané z IP adresy 88.101.224.–

Delphi › Sečtení sudých čísel ve slou…
16. 12. 2013   #185335

   

procedure TForm1.bt_tiskClick(Sender: TObject);
var soubor:TextFile;
pomocnik:integer;
begin
Assignfile(soubor, 'Matice.txt');
rewrite(soubor);
for i:=1 to m do begin
	for j:=1 to n do
  	begin
  	  pomocnik:=StrToInt(sg.Cells[j-1,i-1]);
  	  write(soubor, pomocnik);
  	end;
writeln;
end;
closefile(soubor);

Máš štěstí, že jsem zrovna byl na emailu, když mi přišlo sledování vlákna :D

Delphi › Sečtení sudých čísel ve slou…
15. 12. 2013   #185295

Tady to tady máš celkem zbytečně, doporučuji to udělat normálně takhle..

Assignfile(vystup,'Vysledek.pas');

A pak nechápu co znamená tohle:D  Jestli to znamená typ matice, nebo kolik má matice sloupcu? 

writeln(vystup, n); writeln(vystup, 1);

A celej tenhle řádek vymaž..

var nazev,vysledek:string;

Nech si tam jen :

var Vystup:textfile;

A poslední věc. Ty máš vypsat do souboru pouze ty výsledky, které máš v tom druhým SG, což znamené ten součet sudých čísel ve sloupcích. V tom for cyklu používáš dvojrozměrný pole, který k tomu vlastěn vůbec nepotřebuješ... JEstli chceš vypsat do souboru jen tu hodnotu, tak stačí...

var pomocnik:integer;  // Do varu si přidáš jakoukoliv proměnnou

for j:=1 to n do
  begin
  pomocnik:=StrToInt(sg2.Cells[j-1,0]);
  writeln(vystup,pomocnik);
  end;
Delphi › Sečtení sudých čísel ve slou…
15. 12. 2013   #185292

Tady je celkem dobře vysvětlený tisk. Máš tam konkrétně i tisk SG, podívej se na to...

http://www.zive.cz/clanky/tipy-a-triky-v-delphi-dil-25/sc-3-a-104713/default.aspx

Delphi › Sečtení sudých čísel ve slou…
14. 12. 2013   #185261

Nevím jakou máš knížku, že tam není výpis do souboru, ale určitě ji nahradí internet kde je naprosto vše. Výpis ze StringGridu do .txt není nic jiného než normální zápis do souboru. Na googlu si zadej něco jako: Delphi- StringGrid výpis nebo Delphi- StringGrid tisk nebo Delphi- zápis do souboru txt.

Je mnoho stránek, kde najdeš pomoc. Až budeš mít třeba nějaký kód a budeš si myslet, že ho máš dobře, ale stejně nebude fungovat, tak sem teprve napiš. :D:D:D Hodně štěstí :D

Delphi › Sečtení sudých čísel ve slou…
14. 12. 2013   #185243

Takhle je to správně, ve SG řádky/sloupce začínají nulou...

sg2.Cells[j-1,0]:=IntToStr(soucet(j,a));
Delphi › Sečtení sudých čísel ve slou…
12. 12. 2013   #185186

Uděláš si například nový StringGrid, ale pouze s jedním řádkem (sloupce upravíš podle matice) a tam pomocí for cyklu nahraješ součty sloupců..

procedure TForm1.bt_soucetClick(Sender: TObject);
begin
for j := 1 to n do       // n nebo m , nevim co jsou sloupce :D
  sg.cells[j-1,1] := IntToStr(soucet(j,a);
end;

A nebo jak už Honzc napsal, do tvého stringridu přidáš ještě jeden řádek a tam nahraješ součty. Ale kvůli přehlednosti bych normálně udělal ejště jeden StringGrid s jedním řádkem..... Vše bude přehlednější..

Delphi › Sečtení sudých čísel ve slou…
11. 12. 2013   #185152

Ještě jako dodatek, aby si plně pochopil funkci nebo princip RESULT. Určitě víš, že funkce ti vyhodí rovnou výsledek. Jsou dvě možnosti tedy, jak výsledek do funkce zadat. První je, že když se například ta funkce jmenuje soucet, tak jen napíšeš soucet:=a+b+c+d , ale mužeš to také nahradit result:=a+b+c+d , Result automaticky vyhodnotí, že je konec funkce a výsledek je konečný. Ale když pak danou funkci vyvoláváš, musíš ji normálně vyvolat přes název té funkce .. Nemůžeš napsat, jako ty, result(j,a) , ale musíš ji vyvolat soucet(j,a). Ve tvém programu byl počítač naprosto zmaten.... Doufám, že jsem to napsal nějak srozumitelně :D  

Ještě přidám názornou ukázku

function soucet():integer;
begin
soucet:=1+2+3+4+5+6
end;

// ÚPLNĚ STEJNÉ JAKO

function soucet():integer;
begin
result:=1+2+3+4+5+6
end;

// AVŠAK KDYŽ FUNKCI VYVOLÁVÁŠ, MŮŽEŠ POUŽÍT JEN

Label1.Caption:= IntToStr( soucet() );
Delphi › Sečtení sudých čísel ve slou…
11. 12. 2013   #185151

Tak jsem to rozjel :D:D:D 

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    bt_priprav: TButton;
    edtn: TEdit;
    edtm: TEdit;
    bt_nacti: TButton;
    sg: TStringGrid;
    lbl_pro_n: TLabel;
    lbl_pro_m: TLabel;
    bt_soucet: TButton;
    bt_konec: TButton;
    Label1: TLabel;
    procedure bt_pripravClick(Sender: TObject);
    procedure bt_nactiClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bt_konecClick(Sender: TObject);
    procedure bt_soucetClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  Tmat=array[1..10,1..10] of integer; {určí hodnotu v jaké se má pohybovat
                                       generátor}
var
  Form1: TForm1;
  a:Tmat;
  n,m:integer; {určí proměnnou n a m, konrétně o jaký typ se jedná}
  i,j:integer;
implementation

{$R *.dfm}

procedure TForm1.bt_pripravClick(Sender: TObject);
var sirka,vyska:integer;
begin
n:=StrToInt(Edtn.Text);       {načte z edtn hodnotu pro počet sloupců}
m:=StrToInt(Edtm.Text);       {načte z edtm hodnotu pro počet řádků}
sg.colcount:=n;         {nastavení počtu sloupců pomocí edtn}
sg.rowcount:=m;         {nastavení počtu řádků pomocí edtm}
sirka:=sg.DefaultColWidth;
vyska:=sg.DefaultRowHeight;
sg.Width:=n*sirka+n+4;        {nastavení šírky buňky}
sg.Height:=m*vyska+m+4;       {nastavení výšky buňky}
bt_nacti.Visible:=true;        {po nachystání stringridu se zobrazi
                                tlačítko pro naplnění stringridu}
end;

function soucet(j:integer;a:Tmat):integer;
var i,vysledek:integer;
begin
vysledek:=0;
for i:=1 to m do
  if a[i,j] mod 2=0 then
    vysledek:=vysledek+a[i,j];
result:=vysledek;
end;

procedure TForm1.bt_nactiClick(Sender: TObject);
begin
for i:=1 to m do
for j:=1 to n do
begin
sg.cells[j-1,i-1]:=IntToStr(a[i,j]);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
for i:=1 to 10 do
for j:=1 to 10 do
a[i,j]:=random(10)+1;

end;

procedure TForm1.bt_konecClick(Sender: TObject);
begin
close;
end;

procedure TForm1.bt_soucetClick(Sender: TObject);
begin
 //for j:=0 to n do
  Label1.Caption:=IntToStr(soucet(2,a));
end;

end.

Ještě si změn ten výpis, upravil jsem si to na pracovní verzi :D,  Ta dvojka ukazuje číslo sloupce, kde to cheš zjistit. 

Delphi › Sečtení sudých čísel ve slou…
11. 12. 2013   #185150

Jdu se na to podívat :) 

Delphi › Sečtení sudých čísel ve slou…
11. 12. 2013   #185147

Tak jsem si udělal vlastní krátký program, abych to zkusil a všechno mi to funguje. Abych to měl jednodušší, tak jsem si udělal normálně texťák kam sem napsal 10 čísel, některý sudý, některý lichý. Pak jsem si udělal pole (a) o velikosti 10 a nahrál jsem tam čísla ze souboru. Následně jsem jen zkopíroval tvojí funkci, samozřejmě jsem jen předělal dvojrozměrný pole na jednorozměrný atd... A vše funguje....  Pošlu sem celý program, jen tím chci poukázat na to, že funkce musí být napsaná dobře.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    function soucet():integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a:array[1..10] of integer;
  dll:textfile;

implementation

{$R *.dfm}

function TForm1.soucet():integer;
var i,vysledek:integer;
begin
vysledek:=0;
for i:=1 to 10 do
  if a[i] mod 2=0 then
    vysledek:=vysledek+a[i];
result:=vysledek;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,b:integer;
begin
AssignFile(dll,'text.txt');
reset(dll);
for i:=1 to 10 do
  begin
  read(dll,b);
  a[i]:=b;
  end;
closefile(dll);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Label1.Caption:=IntToStr(soucet());
end;

end.

Podívej se k sobě, jestli tam nemáš nějakou chyba, já třeba hned vidím, že by sis měl odendat RESULT z VARU.

Delphi › Sečtení sudých čísel ve slou…
11. 12. 2013   #185143

Zkoušel si program odkrokovat ?? A zjistit kde ti to vázne. Hodilo by se to, zadej si break point na funkci soucet a pak to odkrokuj a do Watch Listu si zadej  

i, a[i,j], vysledek

Pak napiš kde ti to začne blbnout.

Delphi › Sečtení sudých čísel ve slou…
11. 12. 2013   #185135

Zkus předělat tu funkci na tohle, přidal jsem jednu neznámou a pak result vyvolám jen jednou....

function soucet(j:integer; var a:Tmat):integer;
var i,vysledek:integer;
begin
vysledek:=0;
for i:=1 to m-1 do
  if a[i,j] mod 2=0 then
    vysledek:=vysledek+a[i,j];
result:=vysledek;
end;
Delphi › Sečtení sudých čísel ve slou…
10. 12. 2013   #185083

Nevím co ti tam přesně nefunguje, ale zkus udělat menší úpravu v tom výpisu, protože si myslím, že samotnou funkci máš dobře. Nechci se mýlit, ale zkus napsat tohle....

procedure TForm1.bt_soucetClick(Sender: TObject);
var result:integer;
begin
label1.caption:=IntToStr(soucet(j,a));  //Jak jsem pochopil, tak (j) je číslo
end;                                   //sloupce a (a) matice.. Tam dosad..

Ten result mi tam nějak neseděl... :D

Delphi › C++ dll použita v Delphi
10. 12. 2013   #185071

Tak nakonec jsem to napsal takhle, vůbec nevím, jestli je to správně. Program funguje a vypisuje to celkem věrohodný výsledek, ale tak ještě to sem hodil, kdyby si někdo všiml nějaké blbosti.  

function setbit(val:byte; bitno:byte; bitval:byte):byte; stdcall; external 'func.dll';


procedure TForm1.Button1Click(Sender: TObject);
var ByteVar:Byte;
begin
MessageBox(0,'DLL Loaded',0,0);
ByteVar:=setbit(2,1,1);        //Zadavatelné hodnoty
MessageBox(0,'Process End',0,0);
Label1.Caption:=IntToStr(ByteVar);
end;
Zeel
Delphi › C++ dll použita v Delphi
10. 12. 2013   #185056

Díky moc za rady, myslím právě připojení a ne přepis, protože u větších knihoven je to zbytečná práce (celé je přepisovat). 

Zeel
Delphi › C++ dll použita v Delphi
9. 12. 2013   #185001

Zdarec, mám takový menší problém s knihovnami, které jsou psány jinde jinde než v Delphách. Mám napsanou velmi jednoduchou knihovnu v C++, která slouží pouze jako cvičná, ale prostě mi to nějak nejde připojit s Delphama.  

********************DLL napsána v C++*****************************

setbit - zmení hodnotu bitu v bajtu

vstupní parametry - vstupní byte, poradí bitu, hodnota změněného bitu (0 nebo 1) --> vrací změněný byte

//*****************************************

BYTE _stdcall setbit(BYTE val, BYTE bitno, BYTE bitval)

{

      BYTE Maska[] = {1,2,4,8,16,32,64,128};

      if(bitval)

      {

            return val | Maska[bitno];

      }

      return val & ~Maska[bitno];

}

********************************************************************************

Prosím poraďte někdo kód do Delph. Děkuji moc

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032019 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý