Toon posts:

[Delphi] Zoeken Naar Een Open Window

Pagina: 1
Acties:
  • 52 views sinds 30-01-2008

Verwijderd

Topicstarter
Hi mense,

Ik heb een chat window die dus als volgt geopend wordt van form1 (main from):

code:
1
2
3
4
5
6
7
8
9
10
11
  ...
  var
        ...
        frmChatWindow   : TForm2;
        ...
  Begin
                ...
                frmChatWindow := TForm2.create(self);
                frmChatWindow.lblTo.Caption := strToUsr;
                frmChatWindow.Show;
 end;


hoe kan ik nu identiciferen welke window what is? Stel jaap message naar piet en een window wordt geopend en piet replyt jaap dus hoe moet de progje weten welke window van piet is?

alvast bedankt voor de antwoorden.

Raju

Verwijderd

Er zijn meerdere wegen die naar rome leiden. Op de manier waarop je het nu doet, heb je een object frmChatWindow. Bewaar die in een array ofzo, en je komt al een heel eind.

Verwijderd

Topicstarter
in een array?

what moet ik in een array bewaren?

tja ik weet dat ik window handle nodig heb en de ToUsername

is dat genoeg?

en hoe moet ik naar een window handle zoeken?

Verwijderd

Verwijderd schreef op 28 april 2004 @ 01:34:
in een array?

what moet ik in een array bewaren?

tja ik weet dat ik window handle nodig heb en de ToUsername

is dat genoeg?

en hoe moet ik naar een window handle zoeken?
Sorry maar het is nogal een basic vraag.

Wat je bv. zou kunnen doen, is een objectlist gebruiken waarin je alle windows bewaart. Je geeft je chatwindow een ID propertie oid, en bewaart alle chatwindows in die objectlist.

Verwijderd

Topicstarter
ik heb de TObjectList efffe gekeken en het blijkt dat ie een object nodig heeft die hij moet adden in de lijst!

wat voor een object vraagtie? kan ik een eigen record maken en die als eigen object type geven?

help pls, ik ben nieuw in dit deel.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:53
Als je help bekijkt, zie je dat er een TObject verwacht wordt.
Als je dus een eigen class schrijft, die je inherit van TObject, kan je een object van je eigen class daar aan toevoegen.

https://fgheysels.github.io/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 25-05 22:48

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 28 april 2004 @ 08:25:
ik heb de TObjectList efffe gekeken en het blijkt dat ie een object nodig heeft die hij moet adden in de lijst!

wat voor een object vraagtie? kan ik een eigen record maken en die als eigen object type geven?

help pls, ik ben nieuw in dit deel.
Geen record. Een Object. Delphi heeft OO ondersteuning. Het basis object (eigenlijk de basis klasse!) is TObject. Elke andere klasse (bijv. TForm) is hier van afgeleid.

Als je in de help kijkt bij de properties en methods van TObjectList dan zie je dat daar TObject in gebruikt wordt. Aangezien een TForm ook een TObject is kan je alle classes in een TObjectList stoppen.

Als je ze via de TObjectList aanspreekt zul je het object moeten casten naar de daadwerkelijk gebruikte klasse om het aan te kunnen spreken.

In de help staat uitgelegd hoe dit precies werkt ;)

Edit: Whoami is mod-af en ineens is ie me te snel af :D

[ Voor 4% gewijzigd door Creepy op 28-04-2004 08:37 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Als je alle forms in je applicatie wilt hebben kan je kijken naar Screen.Forms

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
dus wat ik moet doen is een classe schrijven die de window handle en ToUser heeft en die als object opgeven voor TObjectList toch?

waar moet ik type casten dan?

kan iemand effe snel een voorbeeld code laten zien?

EDIT: Ik snap namelijk de TObjectList ding niet echt :(

het is wel duidelijk het is een lijst met objecten maar wat die object precies bevat is erg onduidelijk ik heb help geschekt maar word er niet wijs van :(

[ Voor 35% gewijzigd door Verwijderd op 28-04-2004 14:11 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:53
Misschien kan je eerst eens de basics van programmeren doornemen, en een tutorial Delphi volgen?

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik heb delphi op school gehad.

maar niet met classes en zo tja ik heb zelf initiatief genomen om door te leren omdat ik nu een network deisgn opelding volg en geen programeren, krijg ik ook nix meer dan basic van delphi (zonder classes)

Verwijderd

Ok, iets uitgebreider dan..

je maakt hier:

code:
1
2
3
frmChatWindow := TForm2.create(self);
                frmChatWindow.lblTo.Caption := strToUsr;
                frmChatWindow.Show;


Een object aan wat frmChatWindow heet. Ergens in het geheugen van jouw computer zit na deze opdracht een blok gegevens met code wat 'frmchatwindow' heet. Het adres van dit blok zit in 'de variabele' frmchatwindow, met andere woorden frmChatWindow is een referentie aan een object.

Welnu, je wilt kunnen bijhouden welke chatwindows er allemaal open staan. Dit kun je doen door je main form een property 'chatwindows' te geven met als type 'tobjectlist'.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// in de form declaratie 
  private
    FChatwindows : TObjectlist
    [..]
  public
    property ChatWindows: TObjectlist read FChatWindows write FChatwindows;
  end

// in de form create
  ChatWindows:=TObjectlist.create(true);

// in de form destroy
  ChatWindows.Free;

// in de procedure waar het chatwindow aangemaakt wordt:

  frmChatWindow := TForm2.create(self);
  frmChatWindow.lblTo.Caption := strToUsr;
  frmChatWindow.Show;
  ChatWindows.Add(frmChatWindow);


Voor de rest lijkt het me aan te raden dat je de delphi hulp gaat gebruiken, of een goed boek koopt, want dit is echt de basis...

Verwijderd

Verwijderd schreef op 28 april 2004 @ 14:11:
ik heb delphi op school gehad.
En vervolgens schrijf je:
maar niet met classes en zo
Dan durf ik te beweren dat je geen Delphi hebt geleerd! Delphi is de ontwikkelomgeving en Object Pascal de taal. Wat je dan hoogstens hebt geleerd is een beetje Pascal maar aangezien je al aangeeft dat je niet eens weet wat een array is durf ik dat ook nog wel in twijfel te trekken.

Ok, genoeg gekafferd, nu zoeken naar een oplossing.
Je wilt een form na het creeeren toevoegen aan een lijstje zodat je deze weer makkelijk terug kunt vinden.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  lstForms: TObjectList;

procedure MaakLijst
begin
  lstForms:=TObjectList.Create;
end;

procedure VoegFormToe(const ToUser: String)
var
  frmChat: TChatForm
begin
  Application.CreateForm(TfrmChat, frmChat);
  frmChat.lblToUser.Caption := ToUser;
  objList.Add(frmChat);
  frmChat.Show;      
end;

Nu we het form op de juiste wijze hebben gecreeerd en toegevoegd aan het lijstje willen we ook nog terug kunnen zoeken. Die window handle waar je het over had is hierbij onzin omdat je al een lijstje hebt met verwijzingen naar de Forms, we weten de naam dus kunnen we zoeken naar een form waarbij het lblToUser (of hoe je dat ding ook hebt genoemd) met als caption de naam van degene die je zoekt.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function ZoekChatForm(const ToUser: String): TChatForm
var
  I: Integer;
begin
  for I:=0 to lstForms.Count-1 do
    if lstForms[I] is TChatForm then
      if TChatForm(lstForms[I]).lblToUser.Caption = ToUser then
      begin
        Result := TChatForm(lstForms[I]);
        break;
      end;
  Result:=nil;
end;

procedure ToonChatFormVanPiet
var
  frmChat: TChatForm
begin
  frmChat := ZoekChatForm('Piet');
  if Assigned(frmChat) then
    frmChat.BringToFront
  else
    raise Exception('Chat venster van Piet niet gevonden');
end;

Ik heb even geen Delphi bij de hand dus moest dit even uit het blote hoofdje doen, bovendien al een jaar geen Delphi meer gedaan dus kunnen er foutjes in zitten.
Maar goed, hopelijk snap je wel wat er bedoeld wordt en kun je er mee uit de voeten. Toch denk ik dat dit niet de beste manier is om je objecten bij te houden.

Verwijderd

code:
1
2
3
4
5
6
7
8
for I:=0 to lstForms.Count-1 do
    if lstForms[I] is TChatForm then
      if TChatForm(lstForms[I]).lblToUser.Caption = ToUser then
      begin
        Result := TChatForm(lstForms[I]);
        break;
      end;
  Result:=nil;


Leer die jongen nu niet gelijk dit soort smerige break-constructies aan.. Daarnaast heb je een opbjectlist gemaakt, dus die zou ik ook gebruiken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Function ZoekWindow(strUser: String): TForm2;
var
  nWindow: Integer;
  lGevonden: Boolean;
Begin
  Result:=NIL;
  nWindow:=0;
  Repeat
    lGevonden := TForm2(objList[nWindow]).lblTo.Caption = strUser;
    inc(nWindow);
  Until (nWindow=objList.Count) or lGevonden
  If lGevonden then Result:=TForm2(objList[nWindow]);
end;

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:53
Een break is niet smerig, en veel leesbaarder dan een Repeat Until imo.
Daarnaast is een for gewoon sneller.

Maar goed, we hebben hier al eens een discussie gehad over het al of niet 'breaken'.

https://fgheysels.github.io/


Verwijderd

whoami schreef op 28 april 2004 @ 15:33:
Een break is niet smerig, en veel leesbaarder dan een Repeat Until imo.
Daarnaast is een for gewoon sneller.
Dat laatste is quats, een for doet nl. praktisch hetzelfde in machinetaal.

Wat betreft het al dan niet smerig zijn van een break. In bepaalde condities en met mate zijn de statements break en exit wel bruikbaar, in zo ver ben ik het met je eens.

Echter, we hebben hier duidelijk te maken met iemand die nog maar net begint in Delphi, en als je die gelijk break en exits gaat leren, dan krijg je code vol met break en exits. En _dat_ is wel degelijk smerig, want onleesbaar (teveel sprongen).

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:53
Een for is sneller, aangezien er at compile-time al geweten wordt hoeveel keer er gelooped moet worden.
Dat kan geoptimized worden.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Generaal en hvdberg erg bedankt voor jullie antwoorden :)

ik heb een klein vraagje aan hvdberg, in de regel 15 bedoel je soms lstForms.Add(frmChat); inplaats van objList.Add(frmChat); ?

verder vondt ik jou uit leg makkelijk te snappen met behulp van borland help

genraal ik vond jouwne ook erg handig :) ik zal het proberen te snappen en uit voeren als ik vragen heb zal ik jullie vragen :)

bedankt voor de antwoorden

EDIT: Wanneer moet ik de maaklijst procedure aanroepen?

in form create zoals generaal het deed?

[ Voor 12% gewijzigd door Verwijderd op 28-04-2004 16:01 ]


Verwijderd

Topicstarter
wrong message :P

[ Voor 177% gewijzigd door Verwijderd op 28-04-2004 17:03 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-05 23:27

Tomatoman

Fulltime prutser

Verwijderd schreef op 28 april 2004 @ 15:59:
Generaal en hvdberg erg bedankt voor jullie antwoorden :)

ik heb een klein vraagje aan hvdberg, in de regel 15 bedoel je soms lstForms.Add(frmChat); inplaats van objList.Add(frmChat); ?
Klopt :)
EDIT: Wanneer moet ik de maaklijst procedure aanroepen?

in form create zoals generaal het deed?
De lijst moet natuurlijk al gecreëerd zijn voordat je er iets mee kunt doen. OnCreate is daar inderdaad een goede plaats voor. Vergeet trouwens niet de lijst weer te vernietigen (lstForms.Free) wanneer je er klaar mee bent, want anders wordt het geheugen dat het lijst-object in beslag neemt nooit meer vrijgegeven (geheugenlek). Dat kun je bijvoorbeeld in OnDestroy van het form doen.
Verwijderd schreef op 28 april 2004 @ 14:53:
[...]
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
function ZoekChatForm(const ToUser: String): TChatForm
var
  I: Integer;
begin
  for I:=0 to lstForms.Count-1 do
    if lstForms[I] is TChatForm then
      if TChatForm(lstForms[I]).lblToUser.Caption = ToUser then
      begin
        Result := TChatForm(lstForms[I]);
        break;
      end;
  Result:=nil;
end;
Regel 12 moet je even verplaatsen (direct vóór regel 5), dan klopt het weer. Zoals het er nu staat, retourneert deze functie altijd nil.

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
ja klopt en ik heb het anders gedaan en ik zal het zometeen posten, ben effe aan het test of het werkt :) sorry voor late message

ben net terug van werk

Verwijderd

Topicstarter
het werkt goed :D

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{- ---- --- ---- ------ -}
{- Open New Chat Window -}
{- ---- --- ---- ------ -}
  procedure TForm1.OpenChat(strToUsr, strMsg: String);
  var
        frmChatWindow   : TForm2;
        iCounter        : Integer;
        blnFound        : Boolean;

  begin
        {- First Find Whether Window Is Open -}
        blnFound := False;
        iCounter := 0;
        while iCounter < lstChatWindows.Count do
        begin
                if (lstChatWindows[iCounter] is TForm2) AND not(blnFound) then
                begin
                        if TForm2(lstChatWindows[iCounter]).lblTo.Caption = strToUsr then
                        begin
                                blnFound := True;
                                frmChatWindow := TForm2(lstChatWindows[iCounter]);
                        end;
                        Inc(iCounter);
                end;
        end;

        {- If Found Send Message and Activate Window -}
        if blnFound then
        begin
                if strMsg <> '' then
                begin
                        frmChatWindow.memoMsgIn.Lines.Add('['+ TimeToStr(Time) + '] ' + strToUsr + ': ' + strMsg);
                end;
                frmChatWindow.BringToFront;
        end
        else {- Create new window -}
        begin
                Application.CreateForm(TForm2, frmChatWindow);
                frmChatWindow.lblTo.Caption := strToUsr;
                frmChatWindow.Caption := 'Conversation - ' + strToUsr;
                frmChatWindow.memoMsgIn.Clear;
                frmChatWindow.memoMsgIn.Lines.Add('*** Chat Started With ' + strToUsr + ' @ ' + TimeToStr(Time));
                frmChatWindow.memoMsgIn.Lines.Add('');
                if strMsg <> '' then
                begin
                        frmChatWindow.memoMsgIn.Lines.Add('['+ TimeToStr(Time) + '] ' + strToUsr + ': ' + strMsg);
                end;
                lstChatWindows.Add(frmChatWindow);
                frmChatWindow.Show;
        end;
  end;


Kan dit code nog kleiner en makkelijker?

Tips welcome :D

en erg bedankt voor jullie antwoorden :D

heb weer een onderwerp geleerd :D

Dank je wel guyss

[ Voor 197% gewijzigd door Verwijderd op 29-04-2004 02:32 ]


Verwijderd

Topicstarter
ik heb een problemm

als ik met 2 users will chatten dan click ik eerst op piet dan opent het zijn window en dan op jaap en opent het jaap window

en als ik nu weer op piet dubbelclcikt dan zou hij die venster naar voren moeten brengen maar doet het niet en als ik jaap dubbekl click komt wel naar voren

en piet mij messeg stuurt dan komt de scherm wel naar vorennn

en als ik de scherm van piet close dan krijg ik access violation error

raaaaaaaaaaaaaaaaaaaar maar waaaaaaar :( :(

Verwijderd

Topicstarter
kan iemand een bug vinden in de boven staande code?

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:53
Misschien kan je eerst zelf eens gaan 'bughunten'. Delphi is een heel goede IDE en heeft ook alle debugging-faciliteiten die nodig zijn.
A programmer who cannot debug, is blind
Daarnaast kan je hier ook van de edit-functie gebruik maken ipv 2 of 3 posts direct achter elkaar te plaatsen. En misschien kan je ook eens iets aan je spelling doen? Zoals het nu is leest het gewoon irritant: geen leestekens, spelfouten, hoofdletters, etc...

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 15:00

gorgi_19

Kruimeltjes zijn weer op :9

Hoi Raju,

Ik zie dat je hier pas nieuw bent. Ook hier hebben we regels; misschien goed om even een paar aan te geven. :)

Om te beginnen geef je [rml]Raju in "[ Delphi] Zoeken Naar Een Open Window"[/rml] een reactie om te vragen om iemand al suggesties heeft. Dit heeft kicken en zien we liever niet binnen 24 uur. Is binnen 24 uur geen reactie gegeven, dan mag je je topic een schop geven om hem opnieuw onder de aandacht te brengen. De reden is dat mensen ook andere zaken te doen hebben en niet 24 uur per dag @ GoT zitten, ze zien je topic vanzelf wel. :)
Mocht je informatie toe willen voegen, gebruik dan de Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif -knop. (editen)

Dan over je probleem:
Dit begint nu heel erg een "wie ziet de fout en lost het voor mij op?" te worden.
Debuggen is iets wat je zelf moet doen. Je zult dan stapsgewijs moeten gaan kijken welke variabelen op welke momenten welke waarde hebben. Vervolgens controleren of je deze waarde ook echt verwacht c.q. wilt hebben. Stapsgewijs kom je dan dichter bij de regel waar het fout gaat en krijg je, als het een fout is, ook de foutmelding te zien.
Meer informatie: zie debuggen en [rml]whoami in "[ Delphi] Zoeken Naar Een Open Window"[/rml]

Dit topic gaat in ieder geval dicht. Het is nu een kwestie van debuggen geworden en met bovengenoemde link moet je een heel eind kunnen komen. Succes met je applicatie. :)

[ Voor 107% gewijzigd door gorgi_19 op 30-04-2004 13:44 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1

Dit topic is gesloten.