Avatar billede boox Nybegynder
05. april 2004 - 20:36 Der er 13 kommentarer og
1 løsning

Memo box og ListBox arbejde sammen?

hey!

jeg vil gerne have lavet min Form sådan at jeg har en memo box med tekst som skal variere efter hvilken punkt(linie) man vælger i ListBox'en som skal være ved siden af memo'en.. kan det lade sig gøre?? evt. ved at den henter forskellige tekster fra txt filer eller ??
Avatar billede doc404 Novice
05. april 2004 - 22:06 #1
Den helt simple løsning er følgende:

Du gemmer et antal tekstfiler i en folder (her c:\tmp) og kalder dem 0.txt,1.txt,2.txt osv.

Når du så klikker i din listboks, indlæses filen modsvarende linienummeret i listbox'en - husk den først linie hedder 0.


procedure TForm1.ListBox1Click(Sender: TObject);
var
  FileName : string;
begin
  FileName := Format('d:\tmp\%d.txt',[ListBox1.ItemIndex]);
  try
    Memo1.Lines.LoadFromFile(FileName);
  except
    Memo1.Lines.Text := 'Ingen oplysninger...';
  end;
end;
Avatar billede doc404 Novice
05. april 2004 - 22:19 #2
Den første var næsten for grim...

Brug denne istedet:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ListBox1: TListBox;
    procedure ListBox1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    Texts : TStringList;
    function GetText(idx : integer) : string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Memo1.Lines.Text := GetText(ListBox1.ItemIndex);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Texts := TStringList.Create;
  Texts.LoadFromFile('d:\tmp\tekster.txt');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Texts.Free;
end;

function TForm1.GetText(idx: integer): string;
var
  i : integer;
begin
  i := Texts.IndexOf('@@' + IntToStr(idx));
  if i >= 0 then
    begin
      Inc(i);
      Result := '';
      while (i < Texts.Count) and (Copy(Texts[i],1,2) <> '@@') do
      begin
        if Result <> '' then
          Result := Result + #10;
        Result := Result + Texts[i];
        Inc(i);
      end;
    end
  else
    Result := 'Ingen oplysninger';
end;

end.


Din tekst fil skal så se sådan ud:

@@0
nummer 0
nummer 0
@@1
nummer 1
nummer 1
@@2
nummer 2
nummer 2
@@
nummer 3
nummer 3
Avatar billede boox Nybegynder
05. april 2004 - 22:34 #3
oki tak virker perfekt!!!!
MEN hva så hvis jeg gerne vil have en knap der hedder "Frem" og en der hedder "Tilbage"?? så er det vel noget med at flytte ItemIndex en frem og en tilbage??
Avatar billede boox Nybegynder
05. april 2004 - 22:35 #4
havde ik lige set dit svar nummer 2... kigger lige på det!!
Avatar billede boox Nybegynder
05. april 2004 - 22:50 #5
Forskellen på de 2 er så bare at den sidste har alle teksterne i samme txt-dokument?? 

hvordan får man vist: @@ ?? 

kan det så lade sig gøre og lave "frem" og "tilbage" knapper uden at lave alt for meget om?
Avatar billede doc404 Novice
05. april 2004 - 22:55 #6
Jeg havde valgt @@ fordi man nok aldrig ville bruge dem ;-) Men du kan vælge hvad somhelst...

Du kan lave en frem knap på denne måde:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with ListBox1 do
  begin
    if ItemIndex < Items.Count - 1 then
      begin
        ItemIndex := ItemIndex + 1;
        ListBox1.OnClick(ListBox1);
      end;
  end;
end;

ListBox1.OnClick(..) er nødvendig, da dit OnClick event IKKE kaldes når du sætter ItemIndex direkte.
Avatar billede boox Nybegynder
05. april 2004 - 23:43 #7
okey knappen "frem" virker men knappen "tilbage" har jeg lavet således:

procedure TForm2.Image3Click(Sender: TObject);
begin
  with ListBox1 do
  begin
    if ItemIndex < Items.Count then
      begin
        ItemIndex := ItemIndex - 1;
        ListBox1.OnClick(ListBox1);
      end;
  end;
end;

Problemet er bare at når man står på den øverste i listboxen kan man trykke en mere tilbage så der ikke er nogen markeret i listboxen hvor den så viser "Ingen oplysninger" i memo'en ???
Avatar billede doc404 Novice
05. april 2004 - 23:44 #8
if ItemIndex > 0 then ... ;-)
Avatar billede boox Nybegynder
06. april 2004 - 00:47 #9
perfekt!! mente der er med @@:
@@0 er den øverste i listboxen
@@1 er den næste i listboxen
@@2 er den næste igen i listboxen osv. men hvor er:
@@ ??
Avatar billede boox Nybegynder
06. april 2004 - 00:50 #10
lige et sidste spørgsmål... kan det lade sig gøre at få en label's Caption til at have den samme tekst som et punkt der er markeret i ListBoxen? altså så den ændre sig når man trykker på de forskellige punkter?? (behøves ik lige være den tekst men bare så den ændre sig når man trykker rundt i listboxen?) det er vel det samme princip som før med en txt fil og så bare i stedet for at sætte detind i memo'en så bare i label1.Caption eller hva??
Avatar billede doc404 Novice
06. april 2004 - 00:56 #11
@@ var en smutter.. skulle have være @@3 ;-)

Og ja, det er samme princip mht. til en label. Det kunne måske være smart at skrive den tekst, der skal stå i din label efter @@nn - altså f.eks. @@1 Overskrift 1.

Så kan du bare ikke bruge indexof(..), men er nød til at lede Texts igennem sekventielt... Så der er lidt at hygge sig med ;-)
Avatar billede boox Nybegynder
06. april 2004 - 01:00 #12
jamen tak skal du have, jeg for nok at se til..... i morgen (0= så vil jeg lege lidt med det og se om jeg kan få det til at virke!!
Avatar billede doc404 Novice
06. april 2004 - 01:02 #13
you're welcome...Ellers skriv
Avatar billede boox Nybegynder
06. april 2004 - 12:41 #14
nu siger du jeg ik skal bruge indexof(..) men hvis jeg gør sådan her i funktionen:

function TForm2.GetLabels(idx: integer): string;
var
  k : integer;
begin
  k := Labels.IndexOf('@@' + IntToStr(idx));
  if k >= 0 then
    begin
      Inc(k);
      Result := '';
      while (k < Labels.Count) and (Copy(Labels[k],1,2) <> '@@') do
      begin
        if Result <> '' then
          Result := Result + #10;
        Result := Result + Labels[k];
        Inc(k);
      end;
    end
  else
    Result := 'Ingen oplysninger';
end;

så virker det fint!!
kunne det gøres anderledes?? i tekstfilen er det sadt op på sammen måde som før!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester