Avatar billede well_r Nybegynder
14. juli 2002 - 21:05 Der er 41 kommentarer og
2 løsninger

FORCE memo i bunden

hvordan kan jeg gøre sådan at sådan at man kommer i BUNDEN af en memo?
Avatar billede well_r Nybegynder
14. juli 2002 - 21:34 #1
slet ingen? :(
Avatar billede hermandsen Juniormester
14. juli 2002 - 21:45 #2
Nej nej... Jeg søger... Ta' det nu lige roligt!!! :)
Avatar billede hermandsen Juniormester
14. juli 2002 - 21:46 #3
Sorry... Jeg læste det lige som "Slet igen?" Altså at du ville slette det...

Jo, jeg arbejder på sagen... Vent nu lidt! ;)
Avatar billede hermandsen Juniormester
14. juli 2002 - 22:03 #4
Er det her nok:

SendMessage(Memo1.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);
Avatar billede well_r Nybegynder
14. juli 2002 - 22:51 #5
SendMessage(Memo1.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);

laver den ikke det samme som SHOWMessage?!
Avatar billede nico26 Nybegynder
14. juli 2002 - 22:55 #6
prøv

Memo1.Perform(EM_LINESCROLL, 0, Memo1.Lines.Count);
Avatar billede nico26 Nybegynder
14. juli 2002 - 22:56 #7
og nej, SendMessage og ShowMessage er absolut ikke det samme
Avatar billede hermandsen Juniormester
14. juli 2002 - 23:15 #8
SendMessage sender en besked til enten et vindue eller Windows... Slå den op i hjælpen for nærmere info! ;)
Avatar billede well_r Nybegynder
14. juli 2002 - 23:17 #9
okay..så et andet spm..
hvordan er det at jeg fanger en bestemt form som er blevet oprettet vha "with"

altså.. jeg har en form1 som tjekker om der er kommet nye beskeder.. og hvis der er.. skal den så tjekke om et vindue (form3 lavet med "with") er åbnet.. altså et vindue til denne kontakt person.. HVIS det er åbnet så skal den bare skrive det ind i form3's msg.add.lines(det er en memo)
hvordan gøres det?
kan i svare forhøjer jeg point til det i vil have..næsten da
Avatar billede nico26 Nybegynder
14. juli 2002 - 23:21 #10
du mener at du har lavet en form sådan her

with TForm3.Create(Application) do
begin
  ...
end;

du skal gemme referencen til formen ved at erklære en variabel af typen TForm3

var
  f : TForm3;

...

f := TForm3.Create(Application);
with f do
begin
  ...
end;
Avatar billede well_r Nybegynder
14. juli 2002 - 23:26 #11
jamen.. så vil det sige at jeg skal erklare en masse vars af den type.. altså at alle brugere skal have en var for sig?
Avatar billede nico26 Nybegynder
14. juli 2002 - 23:28 #12
Hvis du skal oprette mange vinduer, skal du nok bruge et array, eller en liste til at gemme referencerne

var
  forme : TList;

...

f := TForm3.Create(Application);
forme.Add(f);
with f do
begin
  ...
end;
Avatar billede well_r Nybegynder
14. juli 2002 - 23:30 #13
hva hvis der er oprettet 3 vinduer
den ene af den er bruger1, bruger2 og bruger3

så skriver bruger2
hvordan får jeg den så til at finde netop DEN form?
Avatar billede nico26 Nybegynder
14. juli 2002 - 23:36 #14
ved at løbe listen igennem, og tjekke bruge navnet på formen

TForm3 = class(TForm)
private
  ...
  FBrugerNavn : string;
public
  ...
  property BrugerNavn : string read FBrugerNavn write FBrugerNavn;
end;

...

var
  forme : TList;

...

for i := 0 to Pred(forme.Count) do
  if TForm3(forme.List^[i]).BrugerNavn = "Bruger2" then
  begin
    ...
    Break;
  end;
Avatar billede hermandsen Juniormester
14. juli 2002 - 23:39 #15
Du opretter et array som nico siger...

var
  Forms: array of TForm3;
  I: Integer;
begin
  SetLength(Forms, 3);
  for I := 0 to 2 do
  begin
    Forms[I] := TForm3.Create(Self);
    Forms[I].Caption := 'Her har vi form ' + IntToStr(I);
  end;
end;

Når du så skal bruge dem til noget mere, så erklær dit array globalt, evt under private eller public og så HUSK at kalde Free proceduren når du er færdig med at bruge dem...

Gøres på OnClose-eventet i Form3:

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
Avatar billede well_r Nybegynder
14. juli 2002 - 23:45 #16
Dette er hvad jeg har i UNIT1 > form3 skal være form4 nu.. så derfor:

procedure Tform1.TjekNyeMsg();
var
  presults: pmysql_res; //results structure *pointer
  prow: pmysql_row;    //row structure *pointer
  i, i2: Integer;        //Counter vars
  query, query2: String;
  forme : TList;
  begin
    query:= 'select * from rachid_chat_delphi where modtager="' + form1.nick.caption + '" and ny="1"'; //Query text
    presults:= nil;
    try
    mysql_query(@mysqlrec, PChar(query)); //Send Query to server
    presults:= mysql_store_result(@mysqlrec); //Store results locally
    if presults^.row_count <> 0 then begin
      for i:= 1 to presults^.row_count do begin
        prow:= mysql_fetch_row(presults);
        for i2 := 0 to Pred(forme.Count) do
          if TForm4(forme.List^[i2]).BrugerNavn = prow[1] then
            begin
          Form4.msg.lines.add(prow[1] +' siger:');
          Form4.msg.lines.add('  ' + prow[3]);
          Break;
        end;
        {with TForm4.Create(NIL) do begin
          modtager.text := prow[1];
          query2 := 'UPDATE rachid_chat_delphi SET ny="0" where id="' + prow[0] + '"';
          mysql_query(@mysqlrec, PChar(query2)); //Send Query to server
          Show;
        end;}
      end; // i
    end;
    finally
        mysql_free_result(presults); //release the stored results from memory
    end;
end;

det som står i { og } er det jeg havde før..
Avatar billede well_r Nybegynder
14. juli 2002 - 23:48 #17
kan forhøje points mere hvis i synes?
Avatar billede hermandsen Juniormester
14. juli 2002 - 23:58 #18
Du skal stadig bruge:

private
  MyForm4: TForm4;

...

MyForm4 := TForm4.Create(Self);
with MyForm4 do
begin
  modtager.text := prow[1];
  query2 := 'UPDATE rachid_chat_delphi SET ny="0" where id="' + prow[0] + '"';
  mysql_query(@mysqlrec, PChar(query2)); //Send Query to server
  Show;
end;

Er det det der er problemet? Jeg føler nemlig ikke at jeg er helt med endnu...
Avatar billede hermandsen Juniormester
15. juli 2002 - 00:00 #19
Når du så skal have flere, så kan du jo bruge et array, et dynamisk array eller en TList...
Avatar billede well_r Nybegynder
15. juli 2002 - 00:05 #20
jamen altså..
jeg vil have at den opretter et nyt vindue hvis et vindue til netop denne person (afsenderen) ikke allerede er oprettet... HVIS det er oprettet skal den blot indsætte beskeden i msg.lines.add
Avatar billede hermandsen Juniormester
15. juli 2002 - 00:13 #21
Så skal du bare lave nogle booleans der som du sætter true/false afhængig af om formen er lavet og åben...

Kom nu... Prøv dig også lidt frem! ;)
Avatar billede well_r Nybegynder
15. juli 2002 - 00:16 #22
*LOL*
jeg er ved at miste overblikket mand *G*
Avatar billede well_r Nybegynder
15. juli 2002 - 00:27 #23
jamen.. jeg kom til at tænke på .. er det ikke totalt umuligt at gøre det på den måde?!
der må vel være en anden måde at gøre det på..
for..
man kan jo heller ikke liiige have en masse booleans til at ligge og flyde.. eller hva?
Avatar billede hermandsen Juniormester
15. juli 2002 - 00:33 #24
>>well_r
Det er derfor at man laver det som array... :)

private
  Forms: array of TForm4;
  Bools: array of Boolean;

Når du så skal oprette en ny form er det bare at bruge SetLength...

Selvfølgelig er der andre metoder, hvilken der er smartest er selvfølgelig afhængig af hvem der laver den... ;)

Men prøv dig lidt frem selv... Det lærer du MEGET mere af!!! ;)
Avatar billede well_r Nybegynder
15. juli 2002 - 00:45 #25
Jeg må nok hurtigt skynde mig at sige.. at jeg lærer meget af at kigge på script > sådan lærte jeg PHP ;o)

men yes yes.. jeg skal prøve mig frem..
men ey.. private > er det i form1 eller er det form4?
Avatar billede hermandsen Juniormester
15. juli 2002 - 00:57 #26
Den skal erklæres under Form1, da du kalder den under fra form1! ;)

Den kunne også ligge under public, så kan de andre forme også se den... Ellers kan du også gøre dem helt globale og lægge dem i et var-afsnit... Så kan alle forme finde dem uden at skulle kalde dem som vars fra en anden form... ;)
Avatar billede nico26 Nybegynder
15. juli 2002 - 01:05 #27
hvorfor ikke bare lægge en property på TForm3, der hedder brugernavn. Så kan du løbe listen eller arrayet igennem, og tjekke alle de oprettede formes brugernavn, og derved finde ud af om der findes en form til den bruger. Se tidligere indlæg.
Avatar billede well_r Nybegynder
15. juli 2002 - 01:07 #28
i'll try..
Avatar billede well_r Nybegynder
15. juli 2002 - 01:13 #29
arh.. har fundet på en hel 3. måde at gøre det på.. vil bare gerne vide.. HVORDAN fjerner jeg en BESTEMT item i en listbox?
Avatar billede well_r Nybegynder
15. juli 2002 - 01:13 #30
og hvordan tjekker jeg om der findes en item i en listbox som inderholder "bruger2"
Avatar billede well_r Nybegynder
15. juli 2002 - 01:18 #31
nevermind.. jeg tror jeg har fundet ud af det ;o)
Avatar billede hermandsen Juniormester
15. juli 2002 - 01:23 #32
>>nico22
Du har sgu ret... Jeg sad selv og overvejede det på et tidspunkt, men kom fra det igen... Det letteste er nok at sætte en property på den, og så skrive den rigtige kode...

>>well_r
Har du prøvet at lave en property, for så tror jeg helt klart at det er det smarteste!
Avatar billede well_r Nybegynder
15. juli 2002 - 01:39 #33
min måde bliver lettere.. jeg arbejder stadig på den... men bare rolig.. i skal nok se den ;)
Avatar billede hermandsen Juniormester
15. juli 2002 - 01:44 #34
Hehe... Nå, men okay så... :)
Avatar billede well_r Nybegynder
15. juli 2002 - 01:57 #35
er stødt på et problem..
ehm
vinduer.Items[i2]; >> den kan ikke finde dette?
Avatar billede well_r Nybegynder
15. juli 2002 - 01:58 #36
nevermind.. kom til at "modsige" mig selv i en IF-sætning :D
Avatar billede well_r Nybegynder
15. juli 2002 - 02:20 #37
procedure Tform1.TjekNyeMsg();
var
  presults: pmysql_res; //results structure *pointer
  prow: pmysql_row;    //row structure *pointer
  i,i2: Integer;        //Counter vars
  query, query2: String;
  fundet : integer;
  begin
    query:= 'select * from rachid_chat_delphi where modtager="' + form1.nick.caption + '" and ny="1"'; //Query text
    presults:= nil;
    try
    mysql_query(@mysqlrec, PChar(query)); //Send Query to server
    presults:= mysql_store_result(@mysqlrec); //Store results locally
    if presults^.row_count <> 0 then begin
      for i:= 1 to presults^.row_count do begin
        prow:= mysql_fetch_row(presults);
        if vinduer.Items.count > 0 then
        for i2 := 0 to vinduer.items.count do begin
          if vinduer.Items[i2] <> prow[1] then
          fundet := 1;
          end else fundet := 0;
        if fundet = 1 then
          with TForm4.Create(NIL) do begin
            modtager.text := prow[1];
            query2 := 'UPDATE rachid_chat_delphi SET ny="0" where id="' + prow[0] + '"';
            mysql_query(@mysqlrec, PChar(query2)); //Send Query to server
            Show;
          end;
      end; // i
    end;
    finally
        mysql_free_result(presults); //release the stored results from memory
    end;
end;


er ved at miste tålmodigheden.. :(
kan du/I se hvad problemet er her? > meningen er at den skal tjekke om brugernavnet findes i vinduer.items > hvis ja > så skal den ikke gøre noget.. hvis nej.. så skal den oprette et vindue

Det der med "fundet" har jeg lige sat ind.. det virker måske ulogisk.. men sig endelig til..
Avatar billede hermandsen Juniormester
15. juli 2002 - 02:42 #38
Jeg formoder at "vinduer" er en ListBox eller TStringList eller noget... I så fald skal du kun køre loopet fra 0 to vinduer.Items.Count-1

Prøv en gang at bryde det op i mindre dele... Det er lige så uoverskueligt for os når vi skal sidde og kigge alt din kode i gennem...

Skrive variablerne, og så den kode der ikke virker! :)

Ellers så kontakt mig på ICQ...
Avatar billede nico26 Nybegynder
15. juli 2002 - 02:45 #39
var
  fundet : boolean;

fundet := False;

for i2 := 0 to vinduer.items.count - 1 do
  if vinduer.Items[i2] = prow[1] then
  begin
    fundet := True;
    Break;
  end;
Avatar billede nico26 Nybegynder
15. juli 2002 - 02:46 #40
if not fundet then
  //opret vindue
Avatar billede nico26 Nybegynder
15. juli 2002 - 02:52 #41
som hermandsen rigtigt siger, gør det tingende nemmere hvis man bryder en kompleks metode op i mindre overskuelige opgaver. Du kan f.eks. lave en metode der hedder FindesBruger();

function FindesBruger(const ANavn: string) : Boolean;
var
  i : Integer;
begin
  Result := False;

  for i := 0 to vinduer.Items.Count - 1 do
    if vinduer.Items[i] = ANavn then
    begin
      Result := True;
      Break;
    end;
end;

så kan du kalde den sådan her

if not FindesBruger(prow[1]) then
  //opret vindue
Avatar billede well_r Nybegynder
15. juli 2002 - 03:59 #42
god idé :)
men jeg brugte sq en lidt anden metode og det virker nu.. sååå jeg vil nok give mig lidt tid før jeg går tilbage og ændrer det.. hehe
NICO22.. lav et svar så jeg også kan acceptere dit svar :)
Avatar billede nico26 Nybegynder
15. juli 2002 - 04:17 #43
et svar
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