Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Inhalte einer TListView auf eine Webseite anzeigen??? (https://www.delphipraxis.net/122212-inhalte-einer-tlistview-auf-eine-webseite-anzeigen.html)

romber 11. Okt 2008 11:45


Inhalte einer TListView auf eine Webseite anzeigen???
 
Hallo!

Ich habe in meinem Programm eine TListView, die systematisch mit Daten befüllt wird. Jedes Item verfügt unter anderem über eine ID sowie Datum und Uhrzeit der Eingabe. Diese Daten aus TListView kann ich dann in einem belibiegen Format abspeichern, z.B. als CSV oder XML.

Nun müssen die Daten auf einer Webseite angezeigt werden und zwar so, dass die Seite nicht jedesmal neu gelden wird, sondern nur die Daten dazu geladen werden, die anhand ID als neu eingestufft wurden. Da muss ich wohl Ajax benutzen und die TListView-Items als XML ausgeben. Ich habe aber keine Ahnung, wie ich jetzt vorgehen soll. Ich nehme an, das wird nicht so einfach.

Wie soll ich das alles anstellen? Habe so etwas no nie gemacht und würde gerne Eure Meinungen hören, wie ich da am besten vorgehen soll.
Vielen Dank!

Assertor 11. Okt 2008 12:04

Re: Inhalte einer TListView auf eine Webseite anzeigen???
 
Hi romber,

am einfachsten wäre, das XML per XSLT in HTML auszugeben. Beschäftige Dich mal mit der XSL Transformation.

Gruß Assertor

romber 11. Okt 2008 13:14

Re: Inhalte einer TListView auf eine Webseite anzeigen???
 
Danke für schnelle Antwort!

"Ausgeben" hört sich schön an. Nur habe ich keine Ahnung, wie ich überhaupt dazu komme. Mich würde die ganze Reihenfolge interessieren, wie ich das am besten (nich unbedingt am einfachsten) realisiere. Bestimmt muss ein HTTP-Server her, dazu vielleicht PHP oder so was, keine Ahnung. Ich bin jetzt wirklich auf die Tipps der erfahrenen Programmierer hier angewiesen.

jfheins 11. Okt 2008 13:32

Re: Inhalte einer TListView auf eine Webseite anzeigen???
 
Tja .... ich würde folgendermaßen vorgehen:

:arrow: Ja, du brauchst einen HTTP-Server. Ich weis nicht, ob TIdHTTPServer aus den Indys reichtt, aber n Versuch isses wert.

Dort kannst du dann in einem Event die angeforderte Seite auslesen und eine Antwort zurückgeben. Hier kannst du dann direkt das xml+xslt/html der Listview zurückschicken.

Wenn du AJAX willst, würde ich folgendermaßen vorgehen:

Im ersten Reqest gibt du sowas wie eine Grundstruktur zurück, die Javascript beinhaltet, und folgendes tut:
:arrow: Enthält xslt-Verweis
:arrow: Fordert per AJAX-Request Daten an.
:arrow: Enthält noch keine Daten

Jetzt kannst du im AJAX-Request die Zeit mitschicken, wann die Seite das letzte mal aktualisiert wurde. Bzw. 0 wenn sie gerade geladen wurde.

Im HTTP-Server brauchst du jetzt also 3 Verzweigungen:
:arrow: Es wurde die eigentliche Seite angefordert: Ne Konstante/resourcenstring/Datei ausgeben.
:arrow: Es wurde das XSLT-Stylesheet angefordert ==> Ebenfalls einfach zurückgeben.
:arrow: Es werden Daten angefordert. Jetzt musst du Anhand der mitgelieferten Zeit die Daten raussuchen, die seitdem dazugekommen sind.

So in etwa würde ich mir das vorstellen.

Da HTTP verbindungslos ist, musst du mit dem Javascript pollen, und kannst nicht ereignisbasiert aktualisieren.

MfG,
Julius

Assertor 11. Okt 2008 13:40

Re: Inhalte einer TListView auf eine Webseite anzeigen???
 
Zitat:

Zitat von romber
Ich bin jetzt wirklich auf die Tipps der erfahrenen Programmierer hier angewiesen.

Ich verwende das produktiv in einem kommerziellen Produkt. Also, verstehe ich nicht, warum ich kein "erfahrener Programmierer" sein soll :?

Hast Du das zu XSL-Transformation überhaupt gelesen? Du schreibst eine Beschreibungsdatei, der Client-Browser setzt dann aus dem XML zusammen mit dem XSL mittels der Transformation das Zielformat zusammen. Das geht für XML > XML, XML > HTML, XML > PDF und was auch immer. Liegt am Transformation-Processor, Parser und Deiner Beschreibungsdatei.

Zitat:

Zitat von romber
Nun müssen die Daten auf einer Webseite angezeigt werden

WAS willst Du denn genau machen? Da ist noch viel Interpretationsspielraum.

Sieh Dir mal folgendes an: http://de.selfhtml.org/xml/darstellung/xsltelemente.htm.

Dort sind einfache Beispiele zu XSL.

Fakt: Du brauchst kein AJAX, kein PHP und keine Programmierung in Delphi dafür.

Genau dafür gibt es ja XSLT.

Der Ablauf wäre folgendes:
1) Datein aus ListView in XML exportieren
2) Den XML Header anpassen, damit auf Dein XSL verwiesen wird
3) Seite aufrufen

Gruß Assertor

Edit: Damit es mehr nach Programmierung aussieht kannst Du auch z.B. einen eigenen Parser in Delphi nutzen. z.B. machst Du einen Headerport von C++ des libXSLT. Dann kannst Du Dein eigenes XML in einem Memorystream z.B. ohne Abhängigkeit von MS XML (XSL Parser ist ja beim IE 4+ dabei) per libXSLT in Dein Zielformat wandeln. Das funktioniert zu 100%, ist aber unnötiger Aufwand dank der Browser-XSLT.

Assertor 11. Okt 2008 13:53

Re: Inhalte einer TListView auf eine Webseite anzeigen???
 
Nachtrag mit einem kurzen Beispiel, damit Du die Logik verstehst:

Du hast Deine XML-Datei, z.B.
XML-Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="template.xsl" ?> // dies muß in die Datei, damit der Browser es automatisch umwandelt
<test>
 <titel>Dateiendungen</titel>
 <glossar>
  <eintrag>
   <begriff>bak</begriff>
   <bedeutung>Backup-Datei</bedeutung>
  </eintrag>

  <eintrag>
   <begriff>bmp</begriff>
   <bedeutung>Bitmap-Grafik</bedeutung>
  </eintrag>
 </glossar>
</test>
und Deine template.xsl, z.B.
XML-Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
 <html>
 <head>
 </head>
 <body>
  <xsl:apply-templates />
 </body>
 </html>
</xsl:template>

<xsl:template match="titel">
 <h1><xsl:value-of select="." /></h1>
</xsl:template>

<xsl:template match="glossar/eintrag">
 <p style="font-family:Arial,Helvetica,sans-serif; font-size:16px">
  <xsl:apply-templates />
 </p>
</xsl:template>

<xsl:template match="begriff">
 <b style="color:blue"><xsl:apply-templates />: [/b]
</xsl:template>

<xsl:template match="bedeutung">
  <xsl:value-of select="." />
</xsl:template>

</xsl:stylesheet>
Wenn Du nun das XML im Browser öffnest, wird das XSL automatisch darauf angewandt. Es wird dir nun statt XML formatiertes HTML ausgegeben (weil es so in der template.xsl definiert wird).

Gruß Assertor

romber 11. Okt 2008 17:00

Re: Inhalte einer TListView auf eine Webseite anzeigen???
 
Zitat:

Zitat von Assertor
Ich verwende das produktiv in einem kommerziellen Produkt. Also, verstehe ich nicht, warum ich kein "erfahrener Programmierer" sein soll :?

Nein, nein, natürlich! Das meinte ich gar nicht! Wirklich nicht. Ich wollte damit nur sagen, dass ich wirklich nichts davon verstehe und so viele Tipps wie möglich brauche. :)

Mit dem XSL ist mir schon klar. Vielleicht habe ich nicht deutlich genug beschrieben was ich da brauche. Und zwar ich möchte nicht jedes mal die ganze Liste auf einer Seite zeigen, wodurch die Seite jedes Mal neu geladen werden muss. Ich möchte so eine art Ticker-Webseite erstellen, die asynchron neue Einträge aus der TListView zieht und auf der bereits geladenen Seite anzeigt, so grob beschriebe. Natürlich verstehe ich, ohne Ensatzt weitere Hilfsmittel wie z.B. Ajax nicht geht. Aber alein die Seite mit XSL in ein darstellbares Format zu bringen reicht mir nicht aus.

romber 11. Okt 2008 17:07

Re: Inhalte einer TListView auf eine Webseite anzeigen???
 
Zitat:

Zitat von jfheins
Im ersten Reqest gibt du sowas wie eine Grundstruktur zurück, die Javascript beinhaltet, und folgendes tut:
:arrow: Enthält xslt-Verweis
:arrow: Fordert per AJAX-Request Daten an.
:arrow: Enthält noch keine Daten

Jetzt kannst du im AJAX-Request die Zeit mitschicken, wann die Seite das letzte mal aktualisiert wurde. Bzw. 0 wenn sie gerade geladen wurde.

Im HTTP-Server brauchst du jetzt also 3 Verzweigungen:
:arrow: Es wurde die eigentliche Seite angefordert: Ne Konstante/resourcenstring/Datei ausgeben.
:arrow: Es wurde das XSLT-Stylesheet angefordert ==> Ebenfalls einfach zurückgeben.
:arrow: Es werden Daten angefordert. Jetzt musst du Anhand der mitgelieferten Zeit die Daten raussuchen, die seitdem dazugekommen sind.

@jfheins

Kannst Du bitte ein bisschen deutlicher jedes Punkt dieser Vorgehensweise beschreiben? Ich kapiere es leider nicht ganz. Danke!

jfheins 11. Okt 2008 17:32

Re: Inhalte einer TListView auf eine Webseite anzeigen???
 
Okay .... mal schauen :)

Du erstellst 2 Webseiten zweckmäßigerweise im Programmpfad oder so.

Die erste ist das Stylesheet. Da kannst du entweder CSS oder XSLT verwenden. Da ich mich mit XHTML+CSS besser auskenne als mit XML+XSLT werde ich das ganze mit XHTML+CSS beschreiben.

In dem Stylesheet definierst du das Aussehen, für die Funktionalität ist es erstmal unwichtig. (Können wir nachher noch dran feilen)

Die zweite ist die eigentliche Seite, die muss ein Javascript beinhalten.
XML-Code:
<evtl. Doctype und xml decl.>
<html ....>
<head>
<title>Blablabla</title>
<script type="text/javascript">

int lastrefresh = 0;

function data()
{
  daten = sende_request('http://meinserver/time=' + lastrefresh);
  werte_ergebnis_aus(daten);
  in_tabelle_einfügen(daten);
}

document.setintervall(data(), 3000);
// alle 3 Sekunden Daten holen

</script>
</head>
<body>

<table>
  <tr>
  <td>Spalte eins</td>
  <td>Spalte zwei</td>
  </tr>
</table>

</body>
</html>
Die Javascript-Funktion holt die Daten ab, und fügt sie in die Tabelle auf der Seite ein.

Jetzt dein Delphi Programm:
(Beim IdHTTPServer gibts ein Event, das aufgerufen wird, wenn ne Anfrage reinkommt. Mangels Delphi jetzt nur Pseudocode ;) )
Delphi-Quellcode:
procedure Das_Event_das_aufgerufen_wird (Requested_Site: String)
begin
if Requested_Site == Main_Page then
  Result = Die_Datei_von_dder_Festplatte_öffnen;

else if Requested_Site == Stylesheet
  Result = Stylesheet_von_der_Festplatte_öffnen;

else // Daten
begin
  integer zeit = extracttime(Requested_Site);
  String daten = ListviewDatenSeit(zeit);
  Result = daten.AsXML();
end;
end;
Oder, um es nochmal zu erklären:

Du gibtst in deinem Delphi-Programm entweder die Seite zurück, oder den Stylesheet, oder die Daten. Die entscheidung kannst du in Abhängigkeit des angeforderten Dateinamens treffen.
Die Seite wiederum fordert die Daten an.
Das Programm muss daraufhin alle Daten raussuchen, die seid dem letzten Refresh verändert wurden. Diese werden dann XML-kodiert zuerückgesendet.

Das Script kann dann die XML-Daten verarbeiten und in die Tabelle einfügen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz